Ich bin an das veraltete Elisp-Makro gewöhnt fletund wurde aufgefordert, zu zu wechseln cl-flet. Doch auf diese Änderung gestoppt einige meiner elisp Programme machen Arbeit und ich erkennen , der Grund , dass, im Gegensatz zu flet, cl-fletnicht für rekursive Funktionen erlaubt. Beispiel: Definieren Sie die folgende Funktion
(defun show-problem-in-action (x)
(cl-flet (
(factorial (n)
(if (= n 0)
1
(* n (factorial (- n 1))) )))
(factorial x) ))
man bekommt keinen Fehler durch Aufrufen
(show-problem-in-action 0)
Ausgabe: 1
weil sich die Funktion "cl-flet-defined" factorialnicht selbst aufruft, wenn "x = 0". jedoch
(show-problem-in-action 5)
erzeugt den Fehler void-function factorial.
Auf der anderen Seite cl-fletdurch das veraltete Makro ersetzen flet, wie unten
(defun no-problem-with-deprecated-macro (x)
(flet (
(factorial (n)
(if (= n 0)
1
(* n (factorial (- n 1))) )))
(factorial x) ))
ermöglicht rekursiven Aufruf:
(no-problem-with-deprecated-macro 5)
Ausgabe: 120
Wenn cl-fletes nicht funktioniert, was wäre meine beste Alternative, um es zu ersetzen fletund trotzdem Funktionen rekursiv aufrufen zu können?
fletundcl-fletnicht die mangelnde Unterstützung für die Rekursion, sondern die Tatsache, dass Funktionsdefinitionenfletmit dynamischem Gültigkeitsbereich bereitgestellt werden, während Funktionsdefinitionencl-fletmit lexikalischem Gültigkeitsbereich bereitgestellt werden. Dynamisches Scoping bietet Unterstützung für die Rekursion, da es sich intern auf eine Indirektion stützt.