Function 在Lisp中,如何通过作为参数传递的名称从宏调用函数?
在Lisp中,如何从宏调用名称为符号的符号值的函数?我可能错了,但我认为我是对的,符号是一个变量 以下是我目前拥有的:Function 在Lisp中,如何通过作为参数传递的名称从宏调用函数?,function,variables,lisp,common-lisp,Function,Variables,Lisp,Common Lisp,在Lisp中,如何从宏调用名称为符号的符号值的函数?我可能错了,但我认为我是对的,符号是一个变量 以下是我目前拥有的: (defmacro cfunc (a b) (list a b)) (defparameter foo 'my-func) (defun my-func (data) '(some-code)) (cfunc foo data) ;does not work (cfunc my-func data) ;works 我想我需要在foo前面添加一些特殊字符,以便在作为函数
(defmacro cfunc (a b) (list a b))
(defparameter foo 'my-func)
(defun my-func (data) '(some-code))
(cfunc foo data) ;does not work
(cfunc my-func data) ;works
我想我需要在foo
前面添加一些特殊字符,以便在作为函数处理之前计算其符号值(cfunc foo data)
创建并调用函数(foo data)
,而不是(my func data)
。我想我可以改为在cfunc
中定义函数
#'foo
不起作用,它给出了(函数foo)
,它cfunc
返回并调用((函数foo)数据)
<代码>(符号值foo)也不能工作。所以我想我不能改变给cfunc
的东西,但是我可以改变函数cfunc
的代码
如果有人有一个特定的资源页面,告诉我如何使用defmacro
进行评估和扩展,或者像#
和'
这样的特殊字符的细节,或者知道我应该查找的关键字,如果可以共享,我将不胜感激,您希望数据所指的是什么?我看不出这里有什么定义。它只是作为my func
函数的一个参数附带提到的,它在扩展cfunc
时不起作用。也许您希望数据
稍后作为一个特殊变量可用
无论如何,您遇到的问题是Common Lisp是一个“Lisp-2”;存在于函数头部的变量不会自动访问其函数单元格以将其强制为函数。在您的情况下,foo
不是环境中绑定的函数;它是一个变量,其值是一个符号(myfunc
)——一个反过来绑定到函数的变量。要导航这个额外的间接级别,您必须请求通过funcall
或在其他情况下通过function
访问该符号的函数单元格
以下是REPL的一些观察结果:
> (symbol-value 'foo)
MY-FUNC
> (ignore-errors (symbol-function 'foo))
NIL
#<UNDEFINED-FUNCTION FOO {1004E22D23}>
> (fboundp 'foo)
NIL
> (ignore-errors (symbol-value 'my-func))
NIL
#<UNBOUND-VARIABLE MY-FUNC {1005324E93}>
> (symbol-function 'my-func)
#<FUNCTION MY-FUNC>
> (fboundp 'my-func)
T
或者,您可以这样写:
(defmacro cfunc (a b)
`(funcall ,a ,b))
您最初提到的表单
(cfunc my-func data)
按预期工作。对于我上面建议的修订,它将不再有效,因为现在myfunc
被视为一个值,将作为funcall
的参数进行计算,而实际上它没有值单元格(因为它是一个函数)。因此,您必须使表单适应以下内容:
(cfunc #'my-func data)
也就是说,“在函数名称空间中查找符号‘my func’,获取其值,并将该函数作为参数提供。”
要更精确地处理Lisp-1和-2中指向函数的符号的差异,请参见Gabriel的-特别是第5节“符号简单性”。多谢大家,data
只是指由cfunc
生成的函数参数。因此,一个问题是将变量名作为cfunc
列表中的第一项,第二个问题是访问符号值的函数值foo
的值为my func
,而my func
的值为函数的函数值。我修改了答案,以便对绑定、变量、值和函数等使用更精确的语言。
(cfunc #'my-func data)