#:g1: ラムダリストでの複雑なパタンマッチ

Posted 2019-06-22 18:59:06 GMT

久々に2ch(5ch)のCommon Lispスレを眺めてみたら面白そうな質問が放置されているのをみつけました。

573デフォルトの名無しさん2019/06/15(土) 16:34:52.25ID:5WxVHbel
defmacroだとdestructuring bind?が使えて
(defmacro test ((a b &optional c) d)
(print (list a b c d))
nil)
(test (1 2) 4) => (1 2 NIL 4)
みたいに書けるけど、&optionalや&keyの後に書こうとしてもSBCLだとdefmacroを評価した時点でエラーになる
&restの後ろには一応書けるっぽい
必須引数と&restの所には書けるけど、&optionalと&keyの所には書けないという認識で良いのか?
もし&optionalの所に書けるなら書き方を教えてくれ 

若干質問の主語が不明瞭ですが、多分、&restや、&optional&keyの後に変数だけでなく再帰的な複合パタンが書けるのかという質問かなと思います。
端的にいうと規格で再帰的な複合パタンが利用できることが定義されているので、規格準拠の処理系なら書けます。

試しに書いてみると、

(defmacro foo (&optional ((a &rest b &key ((^c (c &optional (d "d" d?))) '("c") c?)) '("a") a?))
  `'(,a ,b ,c ,a? ,c? ,d ,d?))

(foo)("a" nil "c" nil nil "d" nil)

(foo (a ^c (c)))(a (^c (c)) c t t "d" nil)

(foo (a :c (c) :allow-other-keys T))(a (:c (c) :allow-other-keys t) "c" t nil "d" nil)

なお、&rest&optional&keyで変数でなく複合パタンを指定した場合、省略時の値がパタンに適合していることに留意する必要があります。


HTML generated by 3bmd in LispWorks 7.0.0

comments powered by Disqus