2016-05-23 23 views
1

I Root of Lisp, lese und kommen in diesem Beispiel:Wie übergeben Sie Operatoren in Ausdrücken in elisp?

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

Allerdings, wenn ich es in Emacs ausgewertet, bekam ich

Symbol's function definition is void: f 

Wenn ich versuche, es auf https://repl.it/languages/scheme, wo es nutzt Schema als Lisp-Interpreter, ich habe

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

Wenn ich dieentfernenauf dem zweiten Lambda-Ausdruck, dieses Beispiel funktioniert auf repl.it, aber hat immer noch den gleichen Fehler auf Emacs.

Antwort

4

Das Anwenden der Funktion f auf '(b c) muss mit funcall erfolgen. So die folgenden Werke:

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

und ausgewertet (a b c).

Paul Graham wahrscheinlich nutzt eine Variante von Lisp mit nur einem Namensraum für Funktionsnamen und Datenvariablen (Lisp-1 oder Scheme-Modell) in seinem article während Elisp ist eine Lisp-2 Sprache mit unterschiedlichen Namensräumen für Funktionen/Variablen. Dies ermöglicht den gleichen Namen für eine Funktion und eine Variable.

So etwas wie

(some-function some arguments) 

der elisp Testamentsvollstrecker sucht nur some-function in der Funktion Namespace, die ein Konstrukt wie funcall oder apply notwendig macht, wenn Sie eine Funktion, die mit einer Variablen aus der Variablennamespace aufrufen möchten.

Die separate Funktion/Variable-Namespace in elisp zu unerwartetem Verhalten führen kann, wenn nicht verstanden:

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

(do-something) ;; => 1 
(funcall do-something) ;; => 2