sol*_*nmv 1 lisp lambda common-lisp
我需要传递函数并使用指定的参数调用它.如何正确地将lambda函数传递给宏并避免此错误:
APPLY:#'(LAMBDA(X)(+ X 1))不是函数名; 尝试使用符号代替
码:
(defmacro runner (fun &rest arg)
(apply fun arg))
Run Code Online (Sandbox Code Playgroud)
呼叫:
(runner #'(lambda (x) (+ x 1)) '(1))
Run Code Online (Sandbox Code Playgroud)
我的代码出了什么问题?尝试了与+
功能类似的东西,一切正常.
更新:程序应为每个参数调用指定的函数并返回结果.参数是列表.所以我应该通过不同的功能列出.
(setq l1 (list 1 2 3))
(setq l2 (list 2 3 4))
(setq l3 (list 3 4 5))
(defmacro runner (fun &rest arg)
; some code
)
(defun summer (l)
(reduce #'+ l))
(print (runner summer l1 l2 l3))
Run Code Online (Sandbox Code Playgroud)
就像这样,但有任意数量的参数.
(defun runner (l)
(mapcar #'(lambda (x) (summer x)) l))
(print (runner (list l1 l2 l3)))
Run Code Online (Sandbox Code Playgroud)
您需要在宏中使用反引号,因此它在运行时扩展为对函数的调用,而不是编译时.
(defmacro runner (fun &rest arg)
`(mapcar (lambda (a) (funcall #',fun a)) (list ,@arg)))
(setq l1 (list 1 2 3))
(setq l2 (list 2 3 4))
(setq l3 (list 3 4 5))
(defun summer (l)
(reduce #'+ l))
(print (runner summer l1 l2 l3))
(print (runner (lambda (x) (+ x 1)) 1 3 4))
Run Code Online (Sandbox Code Playgroud)
由于runner
期望第一个参数是函数名,因此#'
它在调用函数之前添加前缀本身.所以你不应该lambda
在你打电话之前使用它.
我换apply
到funcall
,因为你调用的方式summer
,你希望每个列表显示为一个单一的参数传递,没有扩散.并且因为你的lambda
表达式期望它的参数是单个数字而不是列表,所以我将数字作为单独的参数传递,而不是包含在列表中.
归档时间: |
|
查看次数: |
488 次 |
最近记录: |