在 lisp 中如何使用函数作为变量?
我正在尝试编写一个函数来检查列表 x 中的每个元素是否都具有属性 a,所以我写道:
(defun check (a x)
(if (listp x)
(eval (cons 'and (mapcar #'a x)))))
但它不起作用。 (基本上我希望 a
是函数的名称,例如 blablabla
,并在检查函数的主体中,由 #'a
我想指的是函数 blablabla
,而不是名为 a
的函数。)现在上面的代码不起作用。我认为在 Lisp 中应该能够插入函数。我该如何修复它?
(这实际上是我第一天使用 lisp,所以这可能是一个愚蠢的问题;) 顺便说一句,我正在使用 Lispworks 6.0 个人版本。)
I'm trying to write a function which checks if every element in the list x has property a, so I wrote:
(defun check (a x)
(if (listp x)
(eval (cons 'and (mapcar #'a x)))))
but it doesn't work. (Basically I want a
to be the name of a function, say blablabla
, and in the body of the check-function, by #'a
I want to mean the function blablabla
, instead of a function called a
.) Now the code above doesn't work. I think in Lisp one should be able to plug in functions. How can I fix it?
(It is literally my first day on lisp, so it might be a stupid question ;)
and BTW I'm using Lispworks 6.0 personal version.)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这里不需要使用尖引号语法。其目的是在变量位置使用函数名称,但
a
已经是一个变量。只需编写a
而不是#'a
。There is no need to use the sharp-quote syntax here. Its purpose is to use a function name in a variable position, but
a
is a variable already. Just writea
instead of#'a
.您不需要
eval
,您可以使用apply
。对于问题:您需要
funcall
因为您提供a
作为参数。 (编辑:不是在这种情况下。)通过引用,您只是引用函数a
而不是此函数中的 a。更好,使用
loop
:最好,使用
every
:You don't need
eval
you can useapply
.To the problem: You need
funcall
because you providea
as argument. (Edit: Not in this case.) By quoting you just refer to the functiona
not the a in this function.Better, use
loop
:Best, use
every
:这是我如何编写类似您的检查功能的内容。我尝试给它起一个更具描述性的名字。
编辑:请注意,一个更短、更好的定义是
现在假设我们想用这个函数调用它。请注意,我倾向于尽可能使用声明。我经常搞砸一些事情,如果编译器能够找出错误,那么调试就很容易。而且代码运行速度会更快。
您必须在此处放置#':
Here is how I would write something like your check function. I tried to give it a more descriptive name.
Edit: Note that a shorter and better definition is
Now let's say we want to call it with this function. Note that I tend to use declarations when possible. I quite often screw something up and debugging is easy if the compiler can figure the error out. Also the code will run faster.
You have to place the #' here: