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]