2011-03-18 2 views
4

にラムダ式を渡すためにどのように、私はelispの中に、一般的なWeb検索機能を作成しようとしている:だから、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-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は、関数名をリストの最初の要素として想定しています。代わりに、ラムダ式または関数名に関連付けられたシンボルがある場合は、funcallを使用する必要があります。

+2

これは少なくともelispと共通のlispでは当てはまりますが、それでも関数や変数のスコープ/名前のスペーシングのアーチファクトは依然として残っています。関数と変数の名前空間が別々のスキームやクロージャーやその他のリスプでは、ラムダ式を評価リストの最初の要素として使用し、関数呼び出しとして動作させることができます。 –

関連する問題