Das Noir Makro defpage
gibt mir ein bisschen Ärger. Ich versuche, einen Anruf ähnlich wie folgt zu erstellen:
Anstatt jedoch das Schlüsselwort :post
zu verwenden, möchte ich eine Variable wie folgt verwenden:
Das Problem ist, dass wenn das Makro expandiert, es die Variable my-method
im Namespace compojure.core
statt meiner eigenen auflösen will und mir den Fehler gibt:
Wie kann ich my-method
im aktuellen Kontext auflösen?
Ich denke, das ist ein ähnliches Problem zu: Wie kann ich die doc-Funktion von clojure auf eine Reihe von Funktionen anwenden Ein Makro kann mit seinen Argumenten alles machen, was es will, also kann das Übergeben eines nackten Symbols zu unvorhersehbaren Ergebnissen führen.
Ein Weg, es zu lösen, aber es ist nicht schön:
%Vor%Beachten Sie, dass meine Methode hier kein Literal ist, daher wird sie zunächst in unserem eigenen Namespace aufgelöst und ausgewertet, bevor Sie in eval gehen.
Es scheint, dass noir nicht so verwendet werden soll, weil es das Argument method verwendet und es in das Symbol in compojure.core
umwandelt (siehe Ссылка ). Es bedeutet, dass es keine Variable an diesem Ort erwartet, nur Literale. Also ich glaube nicht, dass Sie etwas dagegen tun können, außer ein Problem an noir zu posten ...
Wenn wir die Datei noir / core.clj durchgehen ( Quelle ) , finde parse-route-Funktion und begründe das, was sie mit ihrem method -Argument tut (dort heißt Aktion), könnten wir herausfinden, dass das Schlüsselwort method in string, in Großbuchstaben umgewandelt und in compojure.core-Namespace aufgelöst wird. All dies wird während der Makroerweiterungszeit durchgeführt. Daher ist es nicht möglich, eine Variable anstelle eines Schlüsselworts zu verwenden, ohne den Code zu ändern.