Ich habe ein Makro, das ein Modul wie folgt definiert.
%Vor%Die Ausgabe von running ist:
%Vor% Was macht Sinn? MacroFun.define_module
wurde in Runner.run
aufgerufen, daher wurde das Modul definiert und somit unter dem Modul Runner
verschachtelt.
Aber jetzt, wenn ich MacroFun.define_module
ändere, um die Option :bind_quoted
zu verwenden:
Die Ausgabe wird jetzt:
%Vor%Warum ??
Ich denke, das liegt daran, dass Sie an der Stelle wo die Variable name
aufheben (binden).
Im ersten Fall heben Sie die Variable name
auf, wenn Sie ein Modul erstellen. Wenn Sie also die Variable binden möchten, müssen Sie den Kontext überprüfen (prüfen Sie, ob sich der Code in einem anderen Modul befindet). So erhalten Sie Ihr aktuelles Atom und den entsprechenden Kontext: Runner.Foo
.
Im zweiten Fall heben Sie die Variable name
auf, bevor sie in einem Kontext platziert wird. Daher ändert sich ihr Wert nicht und es wird das Atom Foo
(kein Kontext) angezeigt.
Mit diesem Code sehen Sie die korrekten Werte, die zum Erstellen der Module verwendet wurden:
%Vor%Ausgabe:
%Vor%Tags und Links macros elixir metaprogramming