lisp関数編

12
LISP 関数編 Satoshi Watanabe

Upload: satoshi-watanabe

Post on 25-Jan-2015

429 views

Category:

Technology


1 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Lisp関数編

LISP 関数編Satoshi Watanabe

Page 2: Lisp関数編

関数の定義• defunを使って関数を定義できる

•引数は関数名、パラメータリスト、関数本体

(define our-third (x)

(car (cdr (cdr x))))

関数名

パラメータリスト

関数本体

実行結果 (our-third '(a b c d)) ⇒ C

Page 3: Lisp関数編

関数はデータ•関数はデータ

•引数に渡すことができる

• apply ⇒関数とその関数を適用する引数リストを引数として、関数を引数リストに適用した結果を返す

(apply #'+ '(1 2 3)) (+ 1 2 3)と同じ結果

Page 4: Lisp関数編

lambda式• defunは関数に名前をつける

•名前をつけずに関数そのものを表現⇒lambda

(lambda (x y) (+ x y))

パラメータリスト

関数本体

((lambda (x y) (+ x y)) 1 2) ⇒ 3

Page 5: Lisp関数編

局所関数• define で定義されるのは大域関数

•どこからでも参照可能

•特定のコンテキストからしか参照できない局所関数も定義可能

(labels ((add10 (x) (+ x 10)) (consa (x) (cons 'a x))) (consa (add10 3)))

局所関数labels内でしか参照できない

Page 6: Lisp関数編

パラメータリスト• &rest

•これ以降の引数は全て一つのリストになる

• &optional

•これ以降は全て省略可能

• &key

•順番ではなくシンボルによって値を設定可能

Page 7: Lisp関数編

パラメータ &rest

(defun our-funcall (fn &rest args) (apply fn args)) ここは一つのリストになる

(our-funcall #'+ 1 2 3)(1 2 3) と扱う

Page 8: Lisp関数編

パラメータ &optional(defun philosoph (thing &optional property) (list thing 'is property)

ここは省略可能省略するとデフォルト値nilになる

(philosoph 'death) ⇒ (DEATH IS NIL)

(defun philosoph (thing &optional (property 'fun)) (list thing 'is property) このようにデフォルト値を

設定できる

Page 9: Lisp関数編

パラメータ &key(defun keylist (a &key x y z) (list a x y z))

これらはすべてoptional

(keylist 1 :y 2) ⇒ (1 NIL 2 NIL)

シンボルで引数の値を指定

Page 10: Lisp関数編

クロージャ•定義された時点で変数に値が設定され、その変数を参照し続ける関数

•関数と環境を一緒にしたもの

(setf fn (let ((i 3)) #'(lambda (x) (+ x i))))

このfnはどこで使用しても3を代入したiを参照し続ける

(funcall fn 2) ⇒ 5

Page 11: Lisp関数編

クロージャ(defun add-to-list (num lst) (mapcar #'(lambda (x) (+ x num)) lst))

このnumはlambda式の外部で定義された

(defun make-addr (n) #'(lambda (x) (+ x n)))

このnをバインドして新しい関数を作成するする

Page 12: Lisp関数編