如何将lambda传递给宏?

如何将lambda传递给宏?,lambda,lisp,common-lisp,Lambda,Lisp,Common Lisp,我需要传递函数并用指定的参数调用它。如何正确地将lambda函数传递给宏并避免此错误: APPLY:#'(LAMBDA(X)(+x1))不是函数名;尝试改用符号 代码: 电话: 我的代码怎么了?尝试了类似的+函数,一切都很好 更新: 程序应该为每个参数调用指定的函数并返回结果。参数是列表。所以我应该传递不同的函数,这些函数接受列表 (setq l1 (list 1 2 3)) (setq l2 (list 2 3 4)) (setq l3 (list 3 4 5)) (defmacro run

我需要传递函数并用指定的参数调用它。如何正确地将lambda函数传递给宏并避免此错误:

APPLY:#'(LAMBDA(X)(+x1))不是函数名;尝试改用符号

代码:

电话:

我的代码怎么了?尝试了类似的
+
函数,一切都很好

更新: 程序应该为每个参数调用指定的函数并返回结果。参数是列表。所以我应该传递不同的函数,这些函数接受列表

(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))
就像这样,但是有任意数量的参数

(defun runner (l)
   (mapcar #'(lambda (x) (summer x)) l))

(print (runner (list l1 l2 l3)))

您需要在宏中使用backquote,因此它在运行时而不是编译时扩展为对函数的调用

(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))
由于
runner
希望第一个参数是函数名,因此它在调用函数之前添加了
#'
前缀本身。因此,在调用
lambda
之前,不应该使用它

我将
apply
更改为
funcall
,因为您调用
summer
的方式表明,您希望每个列表作为单个参数传递,而不是分散传递。由于您的
lambda
表达式期望其参数为单个数字,而不是列表,因此我将这些数字作为单独的参数传递,而不是包装在列表中


您需要在宏中使用backquote,因此它在运行时扩展为对函数的调用,而不是编译时

(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))
由于
runner
希望第一个参数是函数名,因此它在调用函数之前添加了
#'
前缀本身。因此,在调用
lambda
之前,不应该使用它

我将
apply
更改为
funcall
,因为您调用
summer
的方式表明,您希望每个列表作为单个参数传递,而不是分散传递。由于您的
lambda
表达式期望其参数为单个数字,而不是列表,因此我将这些数字作为单独的参数传递,而不是包装在列表中


为什么要用宏而不是函数来实现这一点?宏用于在编译时扩展代码。我需要使用语法创建宏(执行此函数(list1)(list2)…(listn)),并执行类似于mapcar的操作,但使用列表并返回新值。为什么要使用宏而不是函数来创建宏?宏用于在编译时扩展代码。我需要使用语法创建宏(执行此函数(list1)(list2)…(listn)),并执行类似mapcar的操作,但使用列表并返回新值。我认为您上一个defmacro的目的是作为一个defunOk。但我仍然无法生成宏来为所有参数计算指定函数:(请用实际应该做的事情更新问题。显示如果您提供多个参数,它应该扩展到什么。我认为您上一个defmacro的目的是为所有参数计算指定函数。但我仍然无法生成宏来为所有参数计算指定函数:(请用这个问题实际应该做什么来更新这个问题。如果你给出了多个参数,说明它应该扩展到什么。
(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))