如何调用lambda在LISP中传递了一个参数

时间:2012-05-25 05:56:16

标签: lisp elisp

  

可能重复:
  How to pass a lambda expression in Elisp

我有以下代码:

(defun my-map (p l)
  (mapcar (lambda (el) (p el)) l))

(defun test ()
  (my-map (lambda (x) (+ x 1)) (list 1 2 3)))

(这是一个例子 - 不是我试图编写的实际代码)。它抱怨它无法找到函数p:

Debugger entered--Lisp error: (void-function p)
  (p el)
  (lambda (el) (p el))(1)
  mapcar((lambda (el) (p el)) (1 2 3))
  my-map((lambda (x) (x + 1)) (1 2 3))
  test()
  eval((test) nil)
  eval-expression((test) nil)
  call-interactively(eval-expression nil nil)
  recursive-edit()
  debug(error (void-variable test))
  eval(test nil)
  eval-expression(test nil)
  call-interactively(eval-expression nil nil

我猜它将p视为符号而不是外部范围内的变量。如何使它工作?

1 个答案:

答案 0 :(得分:8)

您想使用funcall

  

funcall是`C源代码'中的内置函数。

     

(funcall FUNCTION& rest ARGUMENTS)

     

将第一个参数作为函数调用,将剩余的参数传递给它。   返回函数返回的值。因此,(funcall'cons'x'y)   return(x.y)。