Ich habe eine Funktion f
wie folgt definiert.
f(x, y) = 3x^2 + x*y - 2y + 1
Wie kann ich den folgenden quote
Block für diese Methode abrufen , der den Funktionsinhalt enthält?
quote # REPL[0], line 2:
((3 * x ^ 2 + x * y) - 2y) + 1
end
Wie die Leute in den Kommentaren erwähnt haben, ist das Durchsuchen der Felder dieser Methoden keine stabile oder offiziell unterstützte API. Außerdem täuscht Ihr einfaches Beispiel. Dies ist im Allgemeinen nicht repräsentativ für den ursprünglichen Code, den Sie für die Methode geschrieben haben. Es handelt sich um eine vereinfachte AST-Zwischendarstellung mit Variablen für die Einzelzuweisung und einem drastisch vereinfachten Kontrollfluss. Im Allgemeinen ist der zurückgegebene AST kein gültiger Julia-Code der obersten Ebene. Es kommt einfach so vor, dass es für Ihr einfaches Beispiel so ist.
Es gibt jedoch einen dokumentierten Weg, dies zu tun. Sie können verwenden code_lowered()
, um Zugriff auf diese Zwischendarstellung zu erhalten, ohne in undokumentierten Feldern zu stöbern. Dies wird in allen Julia-Versionen funktionieren, aber ich glaube, es gibt noch keine offiziellen Garantien für die Stabilität der Zwischendarstellung. Hier ist ein etwas komplizierteres Beispiel:
julia> f(X) = for elt in X; println(elt); end
f (generic function with 1 method)
julia> code_lowered(f)[1]
LambdaInfo template for f(X) at REPL[17]:1
:(begin
nothing
SSAValue(0) = X
#temp# = (Base.start)(SSAValue(0))
4:
unless !((Base.done)(SSAValue(0),#temp#)) goto 13
SSAValue(1) = (Base.next)(SSAValue(0),#temp#)
elt = (Core.getfield)(SSAValue(1),1)
#temp# = (Core.getfield)(SSAValue(1),2) # line 1:
(Main.println)(elt)
11:
goto 4
13:
return
end)
julia> code_lowered(f)[1] == methods(f).ms[1].lambda_template
true
Wenn Sie den Code wirklich genau so sehen möchten, wie er geschrieben wurde, verwenden Sie am besten die eingebetteten Datei- und Zeileninformationen und verweisen auf die Originalquelle. Beachten Sie, dass Gallium.jl (Julias Debugger) genau auf diese Weise die Quelle findet, die beim Durchlaufen von Funktionen angezeigt werden soll. Es ist nicht dokumentiert, aber Sie können sogar auf den REPL-Verlauf für interaktiv definierte Funktionen zugreifen. Sehen Sie hier, wie Gallium das macht .
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen