シンボルとリストを取るCommon Lispマクロを書く必要があります。Common Lispマクロで再帰を管理する方法
((X "foo") (Y "bar") (Z "qwerty"))
再帰的マクロの作品は、それがリスト内のシンボルを検索し、それがsymbol
リターンT
、そうでない場合はNIL
を返すを発見した場合:このように、記号や文字列:リストは二つの要素のリストで構成されており。私はこのコードを書いています:
(defmacro already-exist (symbol my-list)
(cond ((null (eval my-list)) NIL)
((eql (caar (eval my-list)) symbol)
T)
(T `(already-exist symbol ,(cdr (eval my-list))))))
しかし問題は再帰的な部分です。実際、最初の要素の一部としてsymbol
を持たないリストでマクロを実行しようとすると、エラーが発生します。例:
(defparameter listt '((X "foo") (Y "bar") (Z "qwerty")))
(already-exist Y listt)
私が得るエラーは「不正な関数呼び出し」です。私はマクロが関数呼び出しとしてY
を評価しようとするために起こると思います。どうすればこの問題を解決できますか?一般にCommon Lispで再帰マクロを書く最良の方法は何ですか?
これには関数を使用する必要があります。マクロはコードを生成するために使用されます。また、 'ASSOC'(または'(member ...:key# 'first) ')を使ってキーがすでに存在するかどうかを調べることもできます。 – jkiiski
@jkiiskiマクロに引用符で囲まれていないシンボルを渡す必要があります。コードでそのシンボルを評価したくないので、そのために関数の代わりにマクロを書くことにしました。関数内で同じ振る舞いを得る方法はありますか?あなたが知っているなら教えてください。とにかく、私はASSOCを知らなかったので、ありがとう!私は心に留めておきます! – Jim
シンボルを引用するかキーワードを使用するだけです。関数のように見えるフォームの評価がうまくいかないと、コードを読んでいる人が混乱します。 – jkiiski