]> git.donarmstrong.com Git - lilypond.git/blobdiff - guile18/examples/scripts/fact
Import guile-1.8 as multiple upstream tarball component
[lilypond.git] / guile18 / examples / scripts / fact
diff --git a/guile18/examples/scripts/fact b/guile18/examples/scripts/fact
new file mode 100755 (executable)
index 0000000..05bcc9f
--- /dev/null
@@ -0,0 +1,69 @@
+#! /usr/local/bin/guile -s
+!#
+;;; Commentary:
+
+;;; This is a command-line factorial calculator.  Run like this:
+;;;
+;;; ./fact 5
+;;;
+;;; to calculate the factorial of 5
+
+;;; Author: Martin Grabmueller
+;;; Date: 2001-05-29
+
+;;; Code:
+
+(use-modules (ice-9 getopt-long))
+
+;; This is the grammar for the command line synopsis we expect.
+;;
+(define command-synopsis
+  '((version (single-char #\v) (value #f))
+    (help    (single-char #\h) (value #f))))
+
+;; Display version information and exit.
+;;
+(define (display-version)
+  (display "fact 0.0.1\n"))
+
+;; Display the usage help message and exit.
+;;
+(define (display-help)
+  (display "Usage: fact [options...] number\n")
+  (display "  --help, -h           Show this usage information\n")
+  (display "  --version, -v        Show version information\n"))
+
+;; Interpret options, if --help or --version was given, print out the
+;; requested information and exit.  Otherwise, calculate the factorial
+;; of the argument.
+;;
+(define (main options)
+  (let ((help-wanted (option-ref options 'help #f))
+       (version-wanted (option-ref options 'version #f))
+       (args (option-ref options '() '())))
+    (cond
+      ((or version-wanted help-wanted)
+       (if version-wanted
+        (display-version))
+       (if help-wanted
+        (display-help)))
+      ((not (= (length args) 1))
+       (display-help))
+      (else
+       (display (fact (string->number (car args))))
+       (newline)))))
+
+;; Calculate the factorial of n.
+;;
+(define (fact n)
+  (if (< n 2)
+    1
+    (* n (fact (- n 1)))))
+
+;; Call the main program with parsed command line options.
+;;
+(main (getopt-long (command-line) command-synopsis))
+
+;; Local variables:
+;; mode: scheme
+;; End: