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]