2016-05-23 11 views
1

私はLispののルートを読んで、この例に遭遇しています:私はEmacsでそれを評価した場合、演算子をelispで式に渡す方法は?

(
(lambda (f) (f '(b c))) 
'(lambda (x) (cons 'a x))) 

しかし、私は私がhttps://repl.it/languages/scheme、どこでそれをしようとした場合

Symbol's function definition is void: f 

を得ましたそれは、スキーマをlispインタプリタとして使用します。

Error: ('lambda ('x) ('cons ('quote 'a) 'x)) is not a function [(anon), (anon)] 

番目のラムダ式のでは、この例はrepl.itで動作しますが、Emacsでも同じエラーが発生しています。

答えて

4

fから'(b c)に適用する場合は、funcallを使用する必要があります。したがって、次の作品:

(
(lambda (f) (funcall f '(b c))) 
'(lambda (x) (cons 'a x))) 

(a b c)に評価されます。

のelispがために異なる名前空間を持つ のLisp-2言語であるのに対し、ポール・グレアムは、おそらく彼の articleに関数名とデータ変数に対して1つだけの名前空間( のLisp-1またはスキームモデル)とlispのいくつかの変種を使用している

関数/変数。これにより、関数と変数に同じ名前を付けることができます。

ので

(some-function some arguments) 

のようなもののためのelisp executorが唯一の構造物を作る機能の名前空間にsome-functionを検索するようfuncallまたはapply必要なあなたは、変数の名前空間から変数に関連付けられている関数を呼び出すしたいと思います。

理解されていない場合はelispの中に別の関数/変数の名前空間には、予期しない動作が発生することがあります。

(defun do-something() (1)) 
(setq do-something #'(lambda() (2))) 

(do-something) ;; => 1 
(funcall do-something) ;; => 2 
関連する問題