"ip"、 "date"、 "url"などの関数があります。これらの関数を使って、 "ip-is"、 "date-is"などの関数を生成したいと思います。プログラム関数定義:ここで「評価」を取り除く方法は?
私は最終的にはうまく動作しますが、それは "eval"を使用する以下の解決策を持っています。
(loop for name in '(ip date url code bytes referer user-agent) do
(let ((c-name (intern (concatenate 'string (symbol-name name) "-IS"))))
(eval `(defun ,c-name (c)
#'(lambda (l) (equal (,name l) c))))))
「邪悪な評価」を取り除く方法を教えてもらえますか?私のプログラムでは、関数名がリストとして提供されることが不可欠です。だから、いくつかのmarcro
(define-predicate ip)
(define-predicate date)
(define-predicate url)
などへの呼び出しが
は私のニーズに合わないでしょう。私は "eval"に関して本当の問題はないが、私は非常に頻繁に読む、その評価は悪いスタイルと考えられ、可能なら避けるべきである。
ありがとうございました!
間違いなくマクロの右ケース。正しい選択として 'eval'を使うことは非常にまれです。 –
@Elias、あなたが書いたことについてのちょっとした質問です。マクロをコンパイル時にコードを生成するために使用するので、マクロは読み込み時に評価できないようです。 – tuscland