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.) (ペーパーバック)

MIT-scheme

    (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]


Shinji KONO / Tue Jun 2 12:17:51 2009