我有一組名爲「ip」,「date」,「url」等功能。程序功能定義:如何在這裏擺脫「eval」?
有了這些,我想生成另一組函數「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))))))
有人可以幫助我,如何擺脫「邪惡eval」?對於我的程序而言,函數名稱作爲列表提供是非常重要的。所以在一定marcro
(define-predicate ip)
(define-predicate date)
(define-predicate url)
等調用
不適合我的需要。我對eval沒有任何問題,但我經常閱讀,認爲eval被認爲是不好的風格,應儘可能避免。
在此先感謝!
絕對是宏正確的情況下。使用'eval'作爲正確的選擇是非常罕見的情況。 – 2013-02-10 16:42:22
@Elias,只是一個關於你寫的內容的問題:在我看來,宏在加載時不能被評估,因爲它們在編譯時被用來生成代碼。 – tuscland 2013-02-12 18:31:50