summaryrefslogtreecommitdiff
path: root/gcd.lisp
blob: da24b5e71fecc7b80209ff125b0b6805dd5f1604 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
; SYNOPSIS:
; # clisp gcd.lisp 11 22 33 121
; # ecl --shell gcd.lisp  121 22 33
; # gcl -f gcd.lisp 121 22 33
; # sbcl --script gcd.lisp 121 22 33

(defun gcd2 (a b)
  (if (= b 0)
    a 
    (gcd2 b (mod a b))))

(defun gcdn (&rest numbers)
  (reduce #'gcd2 (rest numbers)
          :initial-value (first numbers)))

(defun program-args ()
  (or
   #+CLISP *args*
   #+ECL (ext:command-args)
   #+GCL si::*command-args*
   #+SBCL *posix-argv*
   nil))

(defun numbers ()
  (remove nil
          (map 'list (lambda (x) (parse-integer x :junk-allowed t))
               (program-args))))

(write (apply #'gcdn (numbers)))
(fresh-line)