Ich lese kürzlich SICP, um Lisp-Programmierung zu lernen.
Das Buch enthält ein Beispiel für die Erstellung einer Funktionssumme auf hoher Ebene ( siehe unten).
(define (sum term a next b)
...
(term a)
...
(next a)
...
In dieser Funktion sind term und next Funktionen.
Ich möchte die gleiche Funktion in elisp wie folgt schreiben.
(defun sum (term a next b)
....
(funcall term a)
...
(func next a)
....
Dann definiere ich einige Testfunktionen, um die Summe zu testen
(defun inc-test (x) (+ x 1))
sum inc-test 1 inc-test 10
aber es zeigt Fehler wie diesen: Ungültige Funktion: inc-test
Kann mir jemand anrufen, wie ich das Problem beheben kann, da ich neu bei elisp bin? sehr schätzen
sum
?inc-test
in Ihrem letzten Beispiel eine Variable verwendet wird, diese jedoch nicht als Variable definiert ist (es handelt sich um eine Funktion). Sie müssen entweder ein Symbol oder eine Funktionsreferenz an übergebenfuncall
. Daher besteht eine Möglichkeit, Ihren Code zu reparieren, darin, ihn'inc-test
anstelle voninc-test
(beachten Sie das Zitat) zu übergeben.Antworten:
Um zu rekapitulieren, was in den Kommentaren steht,
funcall
wird das Argument aufgehoben (indem nur auf das Argument zugegriffen wird). Zuvor müssen wir außerdem sicherstellen, dass wir nicht versuchen, den Wert des Funktionsnamenparameters auszuwerten oder darauf zuzugreifen, der beim Aufruf der Funktion übergeben wird.Daher scheint eine akzeptable Antwort zu sein:
Oder im Grunde mit
'inc-test
oder(quote inctest)
eher als anrufeninc-test
.quelle