Lisp-2 bedeutet, dass Sie zwei Namespaces haben: einen für Funktionen, einen für die anderen Sachen.
Dies bedeutet, dass Sie einen Funktionswert (oder var-Wert) in einem Makro unwissentlich weniger binden.
Da es in Lisp-1 einen Namensraum gibt, sind Sie (statistisch, aber nicht praktisch) doppelt so wahrscheinlich, eine vorhandene Definition zu treffen.
In der Realität haben Lisp-1s Hygiene, die mit Dingen wie gensym
und Schemes verwirrender Breite von syntax-structure
-ähnlichen Makros bedeckt ist, die Dinge hygienisch halten.
Soweit ich es beurteilen kann, handelt es sich meistens um ein Strohhalm-Argument: Es ist nur ein Problem in den ärmeren oder älteren Implementierungen.
Clojure bietet hygienische Makros durch gensym
oder das Lesermakro myvar#
(das #
ist im Wesentlichen gensym
).
Und Sie müssen sich keine Sorgen über den lokalen Umfang machen, der Ihre Funktion in Ihren Makros wieder herstellt: Clojure ist alles sauber:
%Vor%Und hier ist eine variable Hygiene:
%Vor% Beachten Sie unsere sexy gensym
'd x#
.