2016-12-22 4 views
1

Soweit ich in myfile.jl und fügt sie auf der anrufenden Datei (oder in der Konsole)Was genau beinhaltet tun?

include("myfile.jl") 

nimmt einfach den Code aus der Dokumentation und mehr Beiträgen im Web, die Aussage verstehen könnte, zu ersetzen die Zeile mit der Include-Anweisung.

Bitte korrigieren Sie mich, wenn ich falsch liege. Ich fange gerade mit Julia an. Allerdings habe ich auch den folgenden Kommentar von einem Julias Schöpfer gesehen:

"include works in the dynamically-current module, not the lexically-current one. 
It is really a load-time function, not a run-time one." 

Was ist der Unterschied zwischen dynamisch Strom und lexikalisch-Strom?

Antwort

0

Dies bedeutet, dass Sie diesen Code sofort anstelle von "include" haben, wenn Ihre Anwendung gestartet wird. "Include" wird nicht in der laufenden Anwendung vorhanden sein. Es bedeutet, dass Ihre Anwendung beim Laden etwas langsamer lädt, wenn Sie include verwenden (es ist nicht erkennbar, ich erwähne es zum besseren Verständnis), aber es wird mit include durch Code ersetzt ausgeführt. Ladezeit ist bevor Ihre Anwendung gestartet wird.

+2

Ich denke, diese Antwort ist ein bisschen verwirrt. Will versuchen, @ ChrisRackaucakas Antwort zu klären. – StefanKarpinski

6

Es ist kein Funktionsaufruf, denn wenn myfile.jl nur a = 2 ist und Sie tun include("myfile.jl"), dann können Sie in der REPL prüfen, ob a = 2. In Funktionen, die a in einem anderen Bereich definiert wurden, und dann gelöscht, nachdem die Funktion beendet ist. Das ist also ein deutlicher Unterschied im Verhalten. Hier ist ein Beispiel REPL Sitzung den Unterschied zeigt:

julia> a 
ERROR: UndefVarError: a not defined 

julia> function incl(file) 
      a = "not 2" 
      include(file) 
      @show Main.a 
      @show a 
     end 
incl (generic function with 1 method) 

julia> incl("myfile.jl") 
Main.a = 2 
a = "not 2" 
"not 2" 

julia> a 
2 

Das ist, was sie unter „dynamisch-Strom“ vs „lexikalisch-Strom“. Lexikalisch läuft eine Funktion in einem eigenen Bereich, auf den nur innerhalb des eigentlichen Code der Funktionen zugegriffen werden kann - es gibt keine andere Möglichkeit, auf lokale Variablen zuzugreifen oder sie zu ändern. include läuft immer im aktuellen globalen Gültigkeitsbereich, auch wenn es von einer Funktion aufgerufen wird. Julias eval Funktion verhält sich ähnlich - Sie können lokale Variablen mit eval nur globale nicht sehen oder ändern.

+0

Ich bin immer noch verwirrt, da die detaillierte Antwort von Josh Watzman in http://stackoverflow.com/questions/22394089/static-lexical-scoping-vs-dynamic-scoping-pseudocode scheint zu sagen, dass "dynamisch" bezieht sich auf die Laufzeit (Es hängt davon ab, was auf dem Stapel ist), während der Kommentar, den ich in meinem Beitrag zitierte, include eine Ladezeitfunktion ist, keine Laufzeit. Ändert sich die include-Anweisung im Quelltext vor dem Start der Übersetzung (load-time function) oder wartet sie, bis die Ausführung in diese Zeile kommt und nur dann den Ersetzungscode (run-time function) ausführt? – Soldalma

+2

Ich habe ein Beispiel hinzugefügt und die Antwort deutlich geändert (hoffe, das ist in Ordnung, Chris). Hoffentlich klärt das die Situation ein wenig auf. – StefanKarpinski

+0

Die Änderungen sind großartig. Ich habe es auch gelernt. Es macht das Benennungsschema sinnvoll. Um für Soldalma (und mich selbst) zu expandieren, sind Funktionen in Julia nicht dynamisch, da sie kompiliert sind. Der dynamische Bereich in Julia ist der globale Umfang eines Moduls: Dies ist der Bereich, der nicht nur einen Satz zusammengesetzten Codes hat (Funktionen in Julia spezialisieren sich auf den Versand, so dass sie viele verschiedene Bedeutungen haben können, aber alle sind fest) . Also inkludiert Läufe im aktuellen globalen/dynamischen/Modul-Bereich. Ich verstehe, dass Modulbereiche dynamisch sind, weil die REPL in einem ("Main") laufen muss, aber Stefan könnte eine verfeinerte Antwort haben. –