プログラム断片(2008/06/09)

for VisualWorks 7.6 with Jun780, Lispインタプリタのマニュアル(PDF)

関数を定義する

(defun plus . (lambda (x y) (+ x y)))

(defun plus lambda (x y) (+ x y))

(defun plus (x y) (+ x y))
01
> (defun plus . (lambda (x y) (+ x y)))
plus
> (defun plus lambda (x y) (+ x y))
plus
> (defun plus (x y) (+ x y))
plus

関数を使用する

((lambda (x y) (+ x y)) 3 4)
((lambda (x y) (- x y)) 3 4)
((lambda (x y) (* x y)) 3 4)
((lambda (x y) (/ x y)) 3 4)

(+ 3 4)
(- 3 4)
(* 3 4)
(/ 3 4)

(defun plus (x y) (+ x y))
(plus 3 4)
01
> ((lambda (x y) (+ x y)) 3 4)
7
> ((lambda (x y) (- x y)) 3 4)
-1
> ((lambda (x y) (* x y)) 3 4)
12
> ((lambda (x y) (/ x y)) 3 4)
(3/4)
> (+ 3 4)
7
> (- 3 4)
-1
> (* 3 4)
12
> (/ 3 4)
(3/4)
> (defun plus (x y) (+ x y))
plus
> (plus 3 4)
7

carとcdrそしてconsをラムダ記法で

((lambda (x) (car x)) '(1 2 3))
((lambda (x) (car x)) nil)
((lambda (x) (car x)) '(a b))

((lambda (x) (cdr x)) '(1 2 3))
((lambda (x) (cdr x)) nil)
((lambda (x) (cdr x)) '(a b))

((lambda (x y) (cons x y)) 'a 'b)
((lambda (x y) (cons x y)) 'c nil)
((lambda (x y) (cons x y)) 1 '(2 3))
03
> ((lambda (x) (car x)) '(1 2 3))
1
> ((lambda (x) (car x)) nil)
nil
> ((lambda (x) (car x)) '(a b))
a
> ((lambda (x) (cdr x)) '(1 2 3))
(2 3)
> ((lambda (x) (cdr x)) nil)
nil
> ((lambda (x) (cdr x)) '(a b))
(b)
> ((lambda (x y) (cons x y)) 'a 'b)
(a . b)
> ((lambda (x y) (cons x y)) 'c nil)
(c)
> ((lambda (x y) (cons x y)) 1 '(2 3))
(1 2 3)

carとcdrそしてconsをラベル記法で

(car '(1 2 3))
(cdr '(1 2 3))
(cons 0 '(1 2 3))

(car '(a b))
(cdr '(a b))
(cons 'a 'b)

(car nil)
(cdr nil)
(cons nil nil)
07
> (car '(1 2 3))
1
> (cdr '(1 2 3))
(2 3)
> (cons 0 '(1 2 3))
(0 1 2 3)
> (car '(a b))
a
> (cdr '(a b))
(b)
> (cons 'a 'b)
(a . b)
> (car nil)
nil
> (cdr nil)
nil
> (cons nil nil)
(nil)

clearというラベルを付けられた関数

(clear)

((lambda () (clear)))
08
t

Lispのリスト表記に

11
((lambda ()
   (clear)
   (cons (cons 1 2)
         (cons (cons (cons 3
                           (cons 4 nil))
                     5)
               (cons 6 nil)))))
04
((1 . 2) ((3 4) . 5) 6)

listというラベルを付けられた関数

(list 123)
(cons 123 nil)

(list 1 2 3 4)
(cons 1 (cons 2 (cons 3 (cons 4 nil))))

(list 'a 'b 'c)
(cons 'a (cons 'b (cons 'c nil)))

(list 'a (list 1 2) 'b (list 3) 'c)
(cons 'a (cons (cons 1 (cons 2 nil)) (cons 'b (cons (cons 3 nil) (cons 'c nil)))))
09
> (list 123)
(123)
> (cons 123 nil)
(123)
> (list 1 2 3 4)
(1 2 3 4)
> (cons 1 (cons 2 (cons 3 (cons 4 nil))))
(1 2 3 4)
> (list 'a 'b 'c)
(a b c)
> (cons 'a (cons 'b (cons 'c nil)))
(a b c)
> (list 'a (list 1 2) 'b (list 3) 'c)
(a (1 2) b (3) c)
> (cons 'a (cons (cons 1 (cons 2 nil)) (cons 'b (cons (cons 3 nil) (cons 'c nil)))))
(a (1 2) b (3) c)

N分木を2進木で

12
((lambda ()
   (clear)
   (list (list (list 'k
                     (list 'r 's 't 'u))
               'g
               (list 'm))
         'c
         'd
         (list (list 'n)
               (list 'o
                     (list 'v 'w 'x 'y 'z)
                     'q)))))
05
(((k (r s t u)) g (m)) c d ((n) (o (v w x y z) q)))
13

二進木をたどる

(defun visit (x)
  (cond ((null x) nil)
        ((atom x) nil)
        (t (print x)
           (visit (car x))
           (visit (cdr x)))))
(clear)
(visit '(((k (r s t u)) g (m)) c d ((n) (o (v w x y z) q))))
14
t
> (visit '(((k (r s t u)) g (m)) c d ((n) (o (v w x y z) q))))
(((k (r s t u)) g (m)) c d ((n) (o (v w x y z) q)))
((k (r s t u)) g (m))
(k (r s t u))
((r s t u))
(r s t u)
(s t u)
(t u)
(u)
(g (m))
((m))
(m)
(c d ((n) (o (v w x y z) q)))
(d ((n) (o (v w x y z) q)))
(((n) (o (v w x y z) q)))
((n) (o (v w x y z) q))
(n)
((o (v w x y z) q))
(o (v w x y z) q)
((v w x y z) q)
(v w x y z)
(w x y z)
(x y z)
(y z)
(z)
(q)
nil
(defun visit (x)
  (cond ((null x) nil)
        ((atom x) (print x))
        (t (visit (car x))
           (visit (cdr x)))))
(clear)
(visit '(((k (r s t u)) g (m)) c d ((n) (o (v w x y z) q))))
15
t
> (visit '(((k (r s t u)) g (m)) c d ((n) (o (v w x y z) q))))
k
r
s
t
u
g
m
c
d
n
o
v
w
x
y
z
q
nil

二進木を数える

(defun numberOfNils lambda (x)
  (cond ((null x) 1)
        ((atom x) 0)
        (t (+ (numberOfNils (car x))
              (numberOfNils (cdr x))))))

(defun numberOfAtoms lambda (x)
  (cond ((null x) 0)
        ((atom x) 1)
        (t (+ (numberOfAtoms (car x))
              (numberOfAtoms (cdr x))))))

(defun numberOfCells lambda (x)
  (cond ((null x) 0)
        ((atom x) 0)
        (t (+ 1
              (numberOfCells (car x))
              (numberOfCells (cdr x))))))

(clear)
(numberOfNils  '((1 . 2) ((3 4) . 5) 6))
(numberOfAtoms '((1 . 2) ((3 4) . 5) 6))
(numberOfCells '((1 . 2) ((3 4) . 5) 6))
(numberOfNils  '(((k (r s t u)) g (m)) c d ((n) (o (v w x y z) q))))
(numberOfAtoms '(((k (r s t u)) g (m)) c d ((n) (o (v w x y z) q))))
(numberOfCells '(((k (r s t u)) g (m)) c d ((n) (o (v w x y z) q))))
06
t
> (numberOfNils  '((1 . 2) ((3 4) . 5) 6))
2
> (numberOfAtoms '((1 . 2) ((3 4) . 5) 6))
6
> (numberOfCells '((1 . 2) ((3 4) . 5) 6))
7
> (numberOfNils  '(((k (r s t u)) g (m)) c d ((n) (o (v w x y z) q))))
9
> (numberOfAtoms '(((k (r s t u)) g (m)) c d ((n) (o (v w x y z) q))))
17
> (numberOfCells '(((k (r s t u)) g (m)) c d ((n) (o (v w x y z) q))))
25

二進木の平坦化(未完成なので完成させてください)

(defun flatten (x) 作成してください)

(clear)
(flatten '(1 (2 (3 4) (5) (6 7) 8) 9))
(flatten '(a (b (c (d e))) f (g h) i))
(flatten '((1 . 2) ((3 4) . 5) 6))
(flatten '(((k (r s t u)) g (m)) c d ((n) (o (v w x y z) q))))
10
t
> (flatten '(1 (2 (3 4) (5) (6 7) 8) 9))
(1 2 3 4 5 6 7 8 9)
> (flatten '(a (b (c (d e))) f (g h) i))
(a b c d e f g h i)
> (flatten '((1 . 2) ((3 4) . 5) 6))
(1 2 3 4 5 6)
> (flatten '(((k (r s t u)) g (m)) c d ((n) (o (v w x y z) q))))
(k r s t u g m c d n o v w x y z q)
13s ー【平坦化】→ 16s

for VisualWorks 7.6 with Jun780, Lispインタプリタのマニュアル(PDF)


Updated: 2015/11/08 (Created: 2008/06/09) KSU AokiHanko