2 Stimmen

Wie man die Makro-Syntax `Klassenname/staticField` erweitert

Von den Clojure-Dokumenten aus, so greift man auf ein statisches Feld einer Java-Klasse zu:

Klassenname/staticField

Math/PI
-> 3.141592653589793

Und das ist die Auflösung:

Die Auflösungen lauten wie folgt:

   Klassenname/staticField ==> (. Klassenname staticField)

Ich bekomme das nicht expandiert mit macroexpand*:

> (macroexpand 'Math/E)
Math/E

Was benutze ich, um Klassenname/staticField zu expandieren?

Dies ist Clojure v1.6.0.


*Obwohl dies funktioniert:

> (macroexpand '(Math/E))
(. Math E)

2voto

Alex Punkte 13651

Die Dokumentation ist in dieser Hinsicht ein wenig ungenau. Die Makroausweitung bezieht sich nur auf Listenformen, nicht auf nackte Symbole. Daher werden nur die ersten drei speziellen Formen (Instanzmethoden von Objekten und Klassen, statische Methoden von Klassen) zur Makroausweitung verarbeitet. Die Syntax Klassenname/staticField wird nach der Makroausweitung in einen Zugriff auf ein statisches Feld umgewandelt, wenn Symbole in Vars, Klassen oder let-gebundene Namen aufgelöst werden, wie in http://clojure.org/evaluation beschrieben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X