実践CommonLispメモ

手続きの残り引数

CommonLisp

(defun huga (a &rest b) (list a b)
# (huga 1 2 3) -> (1 (2 3))

scheme

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

schemeにはないので、Gauche

(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) という書き方で初期値を与えること と省略有無の取得が可能

Gauche

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

マクロ書いて好きなように文法を定義しろという話もあるのかもしれない。