如何在Elisp中传递lambda表达式

Eri*_*ric 4 emacs lambda elisp function

所以,我正在尝试在Elisp中创建一个通用的Web搜索功能:

(defun look-up-base (url-formatter)
  (let (search url)
    (setq search(thing-at-point 'symbol))
    (setq url (url-formatter search))
    (browse-url url))
  )
Run Code Online (Sandbox Code Playgroud)

此功能只会抓取光标下的单词,使用url-formatter格式化网页搜索,然后在Web浏览器中打开搜索字符串以执行搜索.

接下来,我尝试使用前一个函数作为基础来实现一个函数,它将谷歌光标下的单词.

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

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

setq: Symbol's function definition is void: url-formatter
Run Code Online (Sandbox Code Playgroud)

我不知道为什么会这样.我看不出这个功能有什么问题,我做错了什么?

Chr*_*isJ 9

我认为你需要使用funcall:

而不是(url-formatter search)你应该拥有的(funcall url-formatter search).

Lisp期望函数的名称作为列表的第一个元素.如果您有一个与lambda表达式或函数名称关联的符号,则需要使用funcall.

  • 请注意,至少elisp和常见的lisp都是如此,但它仍然主要是函数和变量作用域/名称间距的工件.在scheme和clojure以及其他没有函数和变量的单独命名空间的lisps中,可以使用lambda表达式作为计算列表的第一个元素,并使其作为函数调用. (3认同)