Ich stolperte auf this Artikel, der den Y Combinator erklärt. Der Code ist in Scheme, aber ich versuche, mit Common Lisp zu arbeiten.Definieren und Verwenden von Funktionen in Variablen in Common Lisp
Allerdings habe ich Probleme mit der Übersetzung von Scheme zu Common Lisp. Schema verwendet einen einzelnen Namespace für Funktionen und (andere) Variablen, aber Common Lisp verwendet unterschiedliche Namespaces für Funktionen und Variablen. Wie kann ich diesen Unterschied beheben, um den Common Lisp Code zu erhalten?
Scheme Code
Hier einig Scheme-Code aus dem Tutorial.
Am Anfang der Autor die Fakultäts-Funktion definiert:
(define (factorial n)
if (= n 0)
1
(* n (factorial (- n 1)))))
und übersetzt sie in diese:
(define factorial
(lambda (n)
(if (= n 0)
1
(* n (factorial (- n 1))))))
Da (nach Ansicht des Autors) das ist, was Schema funktioniert:
Schema einfach übersetzt die erste Definition in die zweite vor der Auswertung. Also alle Funktionen in Scheme sind wirklich Lambda Ausdrücke.
Common Lisp
ich versucht, sowohl die oben Schnipsel in Common Lisp neu zu schreiben, um diesen Übergang von der ersten Form in die zweite zu imitieren. Aber es gibt keine in CL, noch hat es einen einzigen Namensraum. Also habe ich versucht mich zu betrügen.
Umschreiben der erste Schema Definition in Common Lisp war einfach:
(defun factorial (n)
(if (= n 0)
1
(* n (factorial (- n 1)))))
aber (für mich) diese in die zweite Definition übersetzen ein bisschen schwieriger war. Ich übersetzte es wie folgt aus:
(setf (symbol-function 'factorial)
(lambda (n)
(if (= n 0)
1
(* n (factorial (- n 1))))))
Ist das eine schlechte Art und Weise, dies zu tun (oder gibt es eine bessere Art und Weise)? Es scheint zu funktionieren, aber der Compiler gibt mir eine Stilwarnung: undefined Funktion: Fakultät.
Ich lerne einfach besser den Code selbst eingeben anstatt nur zu lesen. Vielleicht ist dies in diesem Fall nicht die beste Idee wegen der Unterschiede zwischen Scheme und Common Lisp. – Frank