実践CommonLispメモ
手続きの残り引数
CommonLisp
(defun huga (a &rest b) (list a b) # (huga 1 2 3) -> (1 (2 3))
(define (huga a . b) (list a b) # -> (huga 1 2 3) -> (1 (2 3))
ほとんど同じ。schemeの方が楽といえば楽
オプショナル引数
CommonLisp
(defun huga (a &optional b c) (list a b c) # (huga 1 2) -> (1 2 NIL) (defun huga (&optional (a 1 a-supplied?)) (list a a-supplied?)) # (huga 1) -> (1 T) # (huga) -> (1 NIL)
(define (huga a . args) (let-optionals* args ((b 2) (c 3)) (list a b c))) # (huga 1 2) -> (1 2 3) # b や c に値を与えないことはできないようだ。
(car '()) で返るものの違いがここにもあるような気がする。
Gaucheで、let-optionals* の綴りが間違っててもエラーにならず
cがわからんというエラーが出て
5分くらい悩んだ。
キーワード 引数
(defun huga (a &key b c) (list a b c) # (huga 1 :b 2 :c 3) -> (1 2 3) # (huga 1 :c 3) -> (1 NIL 3) #(defun huga (a &key (b 2 b?) (c 3 c?)) (list a b c) という書き方で初期値を与えること と省略有無の取得が可能
(define (huga a . args) (let-keywords* args ((b 2) (c 3)) (list a b c))) # (huga 1 :b 1 :c 1) -> (1 1 1) # (huga 1) -> (1 2 3)
マクロ書いて好きなように文法を定義しろという話もあるのかもしれない。