2011-03-18 50 views
4

所以,我試圖在elisp的一個通用的網絡搜索功能:如何通過在elisp的lambda表達式

(defun look-up-base (url-formatter) 
    (let (search url) 
    (setq search(thing-at-point 'symbol)) 
    (setq url (url-formatter search)) 
    (browse-url url)) 
) 

此功能將剛搶光標下的單詞,格式化的Web字使用url-formatter進行搜索,然後在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 

而且我不知道爲什麼會這樣。我看不出功能有什麼問題,我做錯了什麼?

回答

8

我認爲你需要使用funcall

相反的(url-formatter search)你應該有(funcall url-formatter search)

Lisp希望函數的名稱作爲列表的第一個元素。相反,如果您的符號與lambda表達式或函數名稱相關聯,則需要使用funcall

+2

請注意,至少在elisp和common lisp中這是正確的,但它仍然主要是函數和變量作用域/名稱間距的人工產物。在scheme和clojure以及其他沒有函數和變量的單獨命名空間的lisp中,可以使用lambda表達式作爲計算列表的第一個元素,並將其作爲函數調用工作。 – 2011-03-18 23:17:29