lisp関数編
DESCRIPTION
TRANSCRIPT
LISP 関数編Satoshi Watanabe
関数の定義• defunを使って関数を定義できる
•引数は関数名、パラメータリスト、関数本体
(define our-third (x)
(car (cdr (cdr x))))
関数名
パラメータリスト
関数本体
実行結果 (our-third '(a b c d)) ⇒ C
関数はデータ•関数はデータ
•引数に渡すことができる
• apply ⇒関数とその関数を適用する引数リストを引数として、関数を引数リストに適用した結果を返す
(apply #'+ '(1 2 3)) (+ 1 2 3)と同じ結果
lambda式• defunは関数に名前をつける
•名前をつけずに関数そのものを表現⇒lambda
(lambda (x y) (+ x y))
パラメータリスト
関数本体
((lambda (x y) (+ x y)) 1 2) ⇒ 3
局所関数• define で定義されるのは大域関数
•どこからでも参照可能
•特定のコンテキストからしか参照できない局所関数も定義可能
(labels ((add10 (x) (+ x 10)) (consa (x) (cons 'a x))) (consa (add10 3)))
局所関数labels内でしか参照できない
パラメータリスト• &rest
•これ以降の引数は全て一つのリストになる
• &optional
•これ以降は全て省略可能
• &key
•順番ではなくシンボルによって値を設定可能
パラメータ &rest
(defun our-funcall (fn &rest args) (apply fn args)) ここは一つのリストになる
(our-funcall #'+ 1 2 3)(1 2 3) と扱う
パラメータ &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) このようにデフォルト値を
設定できる
パラメータ &key(defun keylist (a &key x y z) (list a x y z))
これらはすべてoptional
(keylist 1 :y 2) ⇒ (1 NIL 2 NIL)
シンボルで引数の値を指定
クロージャ•定義された時点で変数に値が設定され、その変数を参照し続ける関数
•関数と環境を一緒にしたもの
(setf fn (let ((i 3)) #'(lambda (x) (+ x i))))
このfnはどこで使用しても3を代入したiを参照し続ける
(funcall fn 2) ⇒ 5
クロージャ(defun add-to-list (num lst) (mapcar #'(lambda (x) (+ x num)) lst))
このnumはlambda式の外部で定義された
(defun make-addr (n) #'(lambda (x) (+ x n)))
このnをバインドして新しい関数を作成するする