宿題のマクロに長い間取り組んでいますが、完全に行き詰っています。先生の時間は限られています。締め切りははるかに過ぎています。これは、これを解決するための最後の試みです。
説明は次のとおりです。
多数のパラメータ pattern_i に対してパラメータ expr を照合するマクロ match-pattern を作成します。成功すると、評価中にバインドされた pattern_i の自由変数で body_i が評価されます。
パターンはS式
正確に一致する必要があります
記号引用符は使用できません
Expr は 1 回だけ評価する必要があります
例:
* (match-pattern '((foo bar) foo baz) ((car . car) `(:cons ,car ,car)) ((one two three) `(:three ,one ,two ,three))) (:THREE (FOO BAR) FOO BAZ)
これまでの戦術は次のようなものです。
1
パターンを比較するためにマクロで使用する予定の一致関数。(完全に正しくないかもしれませんが、要点はわかります)
(defun match (sexpr1 sexpr2)
(cond ((and (consp sexpr1) (consp sexpr2))
(and (match (first sexpr1) (first sexpr2))
(match (rest sexpr1) (rest sexpr2))))
((and (atom sexpr1) (atom sexpr2))
t)
(t nil)))
2
expr に対してすべてのパターンをループしたいので、それらを match 関数に渡すことで true または nil を返します。true の場合、パターンの本体に expr を割り当てます。
(defmacro match-pattern (sexpr &body body)
(cond
((match sexpr (car (car body))) (print "sexpr shall match with body here"))
((null (cdr body)) nil)
(t `(match-pattern sexpr ,@(cdr body)))))
3
マッチングがどのように機能するのかわかりません。 #'mapcar を無名ラムダ関数と組み合わせて使用しようとしましたが、それ以上のことはできませんでした。
これは合理的なアプローチのように思えますか? 引用符で多くの問題を抱えています。説明の例では、expr には引用符がありますが、本文のパターンには引用符がありません。これはなぜですか? そして、なぜボディに :three と :cons があるのでしょうか?