gpt4 book ai didi

macros - Lisp:将 &rest 参数传递给宏

转载 作者:太空宇宙 更新时间:2023-11-03 18:39:31 25 4
gpt4 key购买 nike

我正在尝试构建一个函数来访问数据库中的记录:

(select :title "milk" :rating 7)

但是,它只是返回数据库中的所有记录。我相信这是因为我将 &rest 参数传递给一个宏,它按字面解释参数名称“fields”。我尝试从我的宏中删除 &rest ,但随后我收到关于未传递列表的错误。我试过在不同的地方调用(列表字段)无济于事(在宏中,在调用宏的函数中,在宏调用的函数中)。

以下代码按预期工作:

(select-custom (where :title "milk" :rating 7))

并且只返回与参数匹配的记录。

源代码:

(defun select (&rest fields)
(select-custom (where fields)))

(defun select-custom (selector-function)
(remove-if-not selector-function *db*))

(defmacro where (&rest fields)
`#'(lambda (cd) (and ,@(make-comparison-list fields))))

(defun make-comparison-list (fields)
(loop while fields
collecting (make-comparison-exp (pop fields) (pop fields))))

(defun make-comparison-exp (field value)
`(equal (getf cd ,field) ,value))

最佳答案

你可以让 select 变成一个宏

(defmacro select (&rest fields)
`(select-custom (where ,@fields)))

你可以检查一下

(macroexpand-1 '(select :title "milk" :rating 7))

返回

(SELECT-CUSTOM (WHERE :TITLE "milk" :RATING 7))

关于macros - Lisp:将 &rest 参数传递给宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34365126/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com