如何在Elisp中传递lambda表达式

5
所以,我正在尝试在Elisp中创建一个通用的网络搜索函数:
(defun look-up-base (url-formatter)
  (let (search url)
    (setq search(thing-at-point 'symbol))
    (setq url (url-formatter search))
    (browse-url url))
  )

这个函数将仅获取光标下的单词,使用url格式化程序为Web搜索格式化单词,然后在Web浏览器中打开搜索字符串以执行搜索。

接下来,我尝试实现一个函数,该函数将使用前一个函数作为基础,在Google中搜索光标下的单词。

(defun google ()
  (interactive)
  (look-up-base (lambda (search) (concat "http://www.google.com/search?q=" search))))

如果我尝试评估它,Emacs不会抱怨,但是当我尝试使用它时,Emacs会给我这个错误消息:

setq: Symbol's function definition is void: url-formatter

我不知道为什么会发生这种情况。我无法看出函数有什么错,我做错了什么吗?

1个回答

10

我认为你需要使用funcall

不要使用(url-formatter search),而是应该使用(funcall url-formatter search)

Lisp期望列表的第一个元素是函数名。如果你有与lambda表达式或函数名相关联的符号,你需要使用funcall


3
请注意,至少在elisp和common lisp中是正确的,但这仍然主要取决于函数和变量的作用域/命名空间。在scheme、clojure和其他没有为函数和变量分别设置命名空间的lisps中,您可以将lambda表达式用作求值列表的第一个元素,并将其作为函数调用使用。 - Joost Diepenmaat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接