LISP
Menu Menu
LISPの処理系
Scheme Common LISP Emacs LISP
Scheme
MITで開発された。単純な構文が特徴。
Structure & Interpretation of Computer Programs 2e (ISE) (Mit Electrical Engineering and Computer Science Series.) (ペーパーバック)
    (define (fact n)
	(if (= n 0) 1
	 (* n (fact (- n 1)))))))))
Common LISP
標準化されたLISP。コンパイラ向きに設計されている。
Allegro Common LISPの評価版を使うのが便利。
Emacs LISP
Emacs で採用されているLISP
LISPのデータ構造
S式
    (+ 1 1)
    2
    (+ 1 2 3)
    6
    (+ (* 2 3) 1)
    7
(function-name value value ...)
    (defun fact (n)
       (if (zerop n) 1
	   (* n (fact (- n 1)))))
Emacs LISPだと ^-j で式を評価(eval)する。
    (defun fib1 (n a b)
       (if (< b n)
	   (cons b (fib1 n b (+ a b)))
	   nil))
関数呼び出しでは、値は、その場で評価(eval)される。
値は、その場で評価(eval)されないものもある。
    > (setq a 1)
    1
    > a
    1
    > (set (quote a) 1)
    1
    > (quote a)
    a
    > 'a
    a
    > (set 'a 1)
    1
    > (set a 1)
    > (setq b 'a)
    a
    > (set b 10)
    10
    > a
    10
    > b
    a
リスト構造
LISP ( List Processor )
list の作り方
    (list 1 2 3 4 5 'kono 'shinji)
    (1 2 3 4 5 kono shinji)
    '(1 2 3 4 5 kono shinji)
    (quote (1 2 3 4 5 kono shinji))
car と cdr
    (setq x '(1 . 2))
    (1 . 2)
    (car x)
    1
    (cdr x)
    2
append
 (defun app (x y)
   (if (null x) y
       (cons (car x) (app (cdr x) y))))
x y は、そのままで、append されたリストを返す
副作用がない関数
副作用のあるappend
CL-USER(15): (setq x '(a b c))(A B C)CL-USER(16): (setq y '(1 2 3))(1 2 3)
    (defun app1 (x y)
    (if (null (cdr x))                    
    (setf (cdr x) y)
    (app1 (cdr x) y)))
CL-USER(18):  (defun app1 (x y)(if (null (cdr x))                    
(setf (cdr x) y) (app1 (cdr x) y)))APP1 CL-USER(19): x (A B C)CL-USER(20): y (1 2 3)CL-USER(21): (app1 x y)(1 2 3)CL-USER(22): x (A B C 1 2 3)CL-USER(23): x (A B C 1 2 3)CL-USER(24): y (1 2 3)CL-USER(25): (app1 x y)(1 2 3 1 2 3 1 2 3 1 ...)CL-USER(26): y (1 2 3 1 2 3 1 2 3 1 ...)CL-USER(27): x (A B C 1 2 3 1 2 3 1 ...)CL-USER(28): (app1 x y)Error: Stack overflow (signal 1000)
[condition type: SYNCHRONOUS-OPERATING-SYSTEM-SIGNAL]