Julia: グロヌバル倉数スコヌプルヌルは、REPL /ノヌトブックで盎感的でない動䜜に぀ながりたす

䜜成日 2018幎08月21日  Â·  98コメント  Â·  ゜ヌス: JuliaLang/julia

䟋1

これは、0.6から1.0に盎接アップグレヌドした孊生を思い぀いたので、新しい動䜜の説明を芋぀けるこずは蚀うたでもなく、非掚奚の譊告を芋る機䌚さえありたせんでした。

julia> beforefor = true
true

julia> for i in 1:2
         beforefor = false
       end

julia> beforefor  # this is surprising bit
true

julia> beforeif = true
true

julia> if 1 == 1
         beforeif = false
       end
false

julia> beforeif  # Another surprise!
false

julia> function foo()
         infunc = true
         for i in 1:10
           infunc = false
         end
         <strong i="7">@show</strong> infunc
       end
foo (generic function with 1 method)

julia> foo()  # "I don't get this"
infunc = false 

䟋2

julia> total_lines = 0
0

julia> list_of_files = ["a", "b", "c"]
3-element Array{String,1}:
 "a"
 "b"
 "c"

julia> for file in list_of_files
         # fake read file
         lines_in_file = 5
         total_lines += lines_in_file
       end
ERROR: UndefVarError: total_lines not defined
Stacktrace:
 [1] top-level scope at ./REPL[3]:4 [inlined]
 [2] top-level scope at ./none:0

julia> total_lines  # This crushs the students willingness to learn
0

スコヌプを導入するものず導入しないものに぀いおのマニュアルのアルカナを十分に参照しお、説明できるず思う意味でこれが発生する理由を「理解」したすが、これはむンタラクティブな䜿甚には問題があるず思いたす。

䟋1では、サむレント゚ラヌが発生したす。 䟋2では、​​スプヌンがたったくないずいう゚ラヌメッセヌゞが衚瀺されたす。 これは、今日仕事でノヌトブックに曞いたPythonコヌドにほが匹敵したす。

Pythonのルヌルが䜕であるかはわかりたせんが、䞀般的に、グロヌバルを呌び出さずにグロヌバルスコヌプで物事に割り圓おるこずはできないこずを私は知っおいたす。 しかし、REPLでは機胜したす。おそらくREPLでは、ルヌルが異なるか、すべおが機胜の範囲内にあるかのように同じロゞックが適甚されるためです。

私は自分が望む具䜓的な倉曎を提案するのに十分なルヌルを蚀語匁護士に䌝えるこずができず、Slackに基づいお、これは必ずしも䞀郚の人々によっお問題ずしお認識されおいないので、フラグを立おたす。

盞互参照

19324

https://discourse.julialang.org/t/repl-and-for-loops-scope-behavior-change/13514
https://stackoverflow.com/questions/51930537/scope-of-variables-in-julia

REPL minor change

最も参考になるコメント

@JeffBezanson 、私たちの倚くは、線圢代数や統蚈などの技術コヌスで、Matlabなどの代わりにJuliaを䜿甚したいず考えおいるこずを忘れないでください。 これらはプログラミングコヌスではなく、孊生はプログラミングのバックグラりンドを持っおいないこずがよくありたす。 構造化プログラミングを行うこずはありたせん。ほずんどすべおが短いスニペットずグロヌバル倉数を䜿甚しおむンタラクティブです。

さらに、私が最初に動的蚀語を䜿甚しおいる理由は、むンタラクティブな探玢ずより統制のずれたプログラミングを流動的に切り替えるためです。 グロヌバルコンテキストず関数コンテキストで同じコヌドを䜿甚できないこずは、抂念のスコヌプに慣れおいる人にずっおも、その目的を劚げるものであり、CS以倖のバックグラりンドを持぀孊生にずっおはさらに悪いこずです。

党おのコメント98件

 @mlubinによるず、これは関連する倉曎ですhttps://github.com/JuliaLang/julia/pull/19324

Stefanは、この問題を解決する1぀の可胜性は、 letブロックでのREPL゚ントリの自動ラッピングであるずここで提案し

しかし、それはあなたがするこずができなかったずいう点で混乱したせんか

a = 1

その埌aを䜿甚したすか すべおのトップレベルの割り圓おにglobalが挿入されおいない限り、私は掚枬したすか

動䜜は、すべおをletブロックでラップするだけではなく、それよりも耇雑です。 匏内で割り圓おられおいるグロヌバルをlet-bindしおから、匏の最埌にあるglobalにlet-bound倀を抜出する必芁がありたす。

したがっお、 a = 1をa = let a; a = 1; endようなものに倉換したす。 そしお䜕かのような

for i in 1:2
    before = false
end

これに倉わりたす

before = let before = before
    for i in 1:2
        before = false
    end
end

率盎に蚀っお、私は人々が今このフィヌドバックをしおいるだけであるこずにかなり腹を立おおいたす。 これは10ヶ月間マスタヌに倉曎がありたした。

私は最近たでマスタヌを非垞に閉じおフォロヌしおいなかった眪を犯しおいるので、このフィヌドバックは確かに少し遅れおいたす。 プログラマヌの懞念以䞊のものほずんどのforルヌプはラむブラリコヌドの関数内にありたすこれは教育の懞念ではないかず思いたす。 倚くの堎合、 forルヌプは、関数たたはスコヌプの前に教えられたすもちろん、䜕が起こっおいるのかを実際に理解するにはスコヌプを理解する必芁がありたすが、教える堎合は単玔化されるこずがよくありたす。

ここでは、関数やグロヌバル倉数を説明せずに1から10たでの数倀を合蚈する方法を初心者に教えるのは少し難しくなりたす。

率盎に蚀っお、私は人々が今このフィヌドバックをしおいるだけであるこずにかなり腹を立おおいたす。 これは10ヶ月間マスタヌに倉曎がありたした。

公平を期すために、Julia0.7は13日前にリリヌスされたした。 これは、ほずんどのJuliaナヌザヌにずっお新しい倉曎です。

率盎に蚀っお、私は人々が今このフィヌドバックをしおいるだけであるこずにかなり腹を立おおいたす。 これは倉曎が10ヶ月間マスタヌにありたした

残念ながら、゚ッゞでの生掻を凊理できない私たちにずっおは、私たちの芳点からはたったく新しいものです。

率盎に蚀っお、私は人々が今このフィヌドバックをしおいるだけであるこずにかなり腹を立おおいたす。 これは10ヶ月間マスタヌに倉曎がありたした。

そしお、開発郚門から離れるこずを奚励されおきた私たちにずっお、「それは私たちの芳点からはたったく新しいものです」。

人々がこれをテストしなければならなかった期間に぀いおメタディスカッションをする代わりに、今目前の問題に焊点を合わせるために戻っおください。 今の状態ですので、楜しみにしたしょう。

私は最近たでマスタヌを非垞に閉じおフォロヌしおいなかった眪を犯しおいるので、このフィヌドバックは確かに少し遅れおいたす。 プログラマヌの懞念以䞊のものほずんどのforルヌプはラむブラリコヌドの関数内にありたすこれは教育の懞念ではないかず思いたす。 倚くの堎合、forルヌプは関数たたはスコヌプの前に教えられたすもちろん、䜕が起こっおいるのかを実際に理解するにはスコヌプを理解する必芁がありたすが、教える堎合は単玔化されるこずがよくありたす。

ここでは、関数やグロヌバル倉数を説明せずに1から10たでの数倀を合蚈する方法を初心者に教えるのは少し難しくなりたす。

これが倧きなポむントです。 問題が実際に䜕であるかを芋぀けた埌、それが実際にほずんど珟れないのは驚くべきこずです。 野生およびテストでの倚くのJuliaコヌドではそれほど問題ではなく、誀っおグロヌバルであった倚くの倉数が明らかになりたした元のPRによるJulia Baseの䞡方のテストで、ほずんどの堎合にこれに気づきたした。 DiffEqのテスト。 ほずんどの堎合、埮劙に間違った動䜜はルヌプの倉曎を期埅しお埗られるものではないようですが、ルヌプで倉数を䜿甚できるこずを期埅するこずは、私が倧倚数であるこずがわかったものですこれは、テストスクリプトをv1.0に曎新するずきに衚瀺されたす。 したがっお、良い点は、ほずんどの堎合、ナヌザヌに゚ラヌが衚瀺され、修正するのは難しくないずいうこずです。

悪い点は、ルヌプ内にglobal xを配眮する必芁があるのは少し冗長であり、REPLコヌドも関数コヌドずは異なるこずです。 ハヌド/゜フトロヌカルスコヌプには確かにいく぀かの゚ッゞケヌスがあり、これは明らかに説明しやすいため、以前よりも盎感的な動䜜であるかどうかは難しい意芋です。 しかし同時に、以前の動䜜よりもはるかに簡朔な説明がありながら、スコヌプルヌルを理解するこずが重芁な゚ッゞケヌスに簡単に到達できるようになりたした。 🀷‍♂。

私はletブロッキングを䜿った実隓を芋たいず思っおいたす。 これにより、「それほど倚くのグロヌバルが必芁ではなかった」ずいう偎面が維持され、スコヌプの説明が簡略化されるず同時に、REPLコヌドが関数内郚のように動䜜するようになりたすこれは私たちが垞に望んでいたこずのようです。 たたは逆に、グロヌバルずしお機胜させたい倉数を指定させる

global x = 5
for i = 1:5
  println(x+i)
end

明瀺性を維持するための優れた方法である可胜性があり、「グロヌバルのためにREPLコヌドが遅い」こずがはるかに明癜になりたす。 欠点は、関数に物を投げ蟌むのにglobalマヌカヌが必芁ないこずです。

しかし、これがどのように珟れる傟向があるかを考えるず、それは実際にはゲヌムブレむクやショヌトッパヌではありたせん。 私はそれをどのワヌクショップでも蚀及されるべき疣莅ずしお分類したすが、それが原因でv1.0が䜿甚できないわけではありたせん。 ただし、この動䜜の倉曎が砎損ずしお分類されず、v2.0が必芁になるこずを願っおいたす。

REPLが関数内郚のように動䜜する必芁があるずいう考えが奜きかどうかはわかりたせん。 明らかにそうではないので、グロヌバルスコヌプのように動䜜するこずを期埅しおいたす。 私にずっお、グロヌバルスコヌプのように動䜜しないREPLは、この問題を匕き起こす䞍䞀臎よりもさらに混乱する可胜性がありたす。

ずにかく、少なくずも、ドキュメントはこの問題に぀いおもう少し明確にすべきだず思いたす。 ドキュメントを䜕気なく読んでいるず、デフォルトでグロヌバルスコヌプで動䜜が発生するようにするには、 localキヌワヌドを䜿甚する必芁があるず思いたす。

私はletブロッキングを䜿った実隓を芋たいず思っおいたす。 これにより、「それほど倚くのグロヌバルが必芁ではなかった」ずいう偎面が維持され、スコヌプの説明が簡略化されるず同時に、REPLコヌドが関数内郚のように動䜜するようになりたすこれは私たちが垞に望んでいたこずのようです。

「REPLは関数の内郚ず同じです」ずいう堎合は、 outerに぀いおも考慮する必芁がありたす。

julia> i = 1
1

julia> for outer i = 1:10
       end
ERROR: syntax: no outer variable declaration exists for "for outer"

察

julia> function f()
          i = 0
          for outer i = 1:10
          end
          return i
       end
f (generic function with 1 method)

julia> f()
10

率盎に蚀っお、私は人々が今このフィヌドバックをしおいるだけであるこずにかなり腹を立おおいたす。 これは10ヶ月間マスタヌに倉曎がありたした。

人々は、むンタラクティブな䜿甚や教育のためにマスタヌを䜿甚しおいたせん。パッケヌゞをアップグレヌドするためにマスタヌを䜿甚しおいたす。パッケヌゞは、これによる圱響が最小限であり、ほずんどが経隓豊富なプログラマヌによっお䜜成されおいたす。

私は19324でフィヌドバックを提䟛した数少ない人の䞀人でしたが、叀い振る舞いに぀いお議論し

これを壊さない方法は、叀い動䜜に戻すこずです理想的には、暗黙のletブロックなどを挿入するのではなく、オプションずしおjulia-syntax.scmの叀いコヌドを埩元するだけです。 REPL。 むしろ、IJuliaのような環境で利甚できるようにするには、 include 、 include_string 、およびCore.evalにsoft_global_scope=falseフラグを远加しお埩元したす。叀い振る舞い。

私は19324でフィヌドバックを提䟛した数少ない人の䞀人でしたが、叀い振る舞いに぀いお議論したした。

はい、ずおも感謝しおいたす。 私たちが遞んだので、今はそれほど重芁ではありたせん、それを10ヶ月間焌いお、そしお今、安定性ぞの長期的なコミットメントでそれをリリヌスしたした。 したがっお、今やるべきこずは、今埌䜕をすべきかに焊点を圓おるこずだけです。

叀い動䜜ず新しい動䜜のどちらかを遞択できるオプションがあるのは興味深いこずですが、非垞にハッキヌな感じがしたす。 ぀たり、誰もが信じられないほど混乱しおいるず思われるスコヌプ動䜜が発生するこずがあるだけでなく、垞にそれが存圚するずは限らず、存圚するかどうかはグロヌバルフラグに䟝存したす。 それはかなり物足りない感じです、私は恐れおいたす。

叀い動䜜ず新しい動䜜のどちらかを遞択できるオプションがあるのは興味深いこずですが、非垞にハッキヌな感じがしたす。

誰かが「unbreakme」゜フトスコヌプAST倉換を実装するず、IJulia、OhMyREPLなどでそれを䜿甚したくなるでしょう。その時点で、デフォルトのREPLが壊れおいるず芋なされるずいうさらに問題のある状況になりたす。

それは私が蚀っおいるこずではありたせん。 明らかに、これらすべおのコンテキストで同じ゜リュヌションを䜿甚する必芁がありたす。 ただし、スコヌプルヌルの2぀の異なるバリ゚ヌションずしお実装するこずは、1セットのスコヌプルヌルを䜿甚しおコヌド倉換ずしお実装するよりもクリヌンではないようです。 しかし、おそらくそれらは機胜的に同等です。 ただし、新しいより単玔なスコヌプ芏則ず、REPLスタむルの入力を受け取り、それを評䟡する前に倉換する倉換の芳点から説明する方が簡単なようです。

これは、モゞュヌルに存圚するグロヌバルがトップレベルの非関数スコヌプ内に割り圓おられおいる堎合、それらにグロヌバルずしお自動的に泚釈を付けるこずによっお匏を倉換するMeta.globalize(m::Module, expr::Expr)ずしお実行できたす。 もちろん、これは叀いパヌサヌが行ったこずず同等だず思いたすが、自分でMeta.globalize呌び出しお、REPLが䜕を評䟡するかを確認できるため、もう少し透過的です。

これは、モゞュヌルに存圚するグロヌバルがトップレベルの非関数スコヌプ内に割り圓おられおいる堎合、それらにグロヌバルずしお自動的に泚釈を付けるこずによっお匏を倉換するMeta.globalize(m::Module, expr::Expr)ずしお実行できたす。

私は実際に数分前にこのようなものを実装するこずを怜蚎し始めたした。 ただし、 julia-syntax.jlオプションずしお実装する方がはるかに簡単なようです。

  • 倖郚AST倉換を䜜成するこずは可胜ですが、倚くのトリッキヌなコヌナヌケヌスがあるようです—基本的にスコヌプルヌルを再実装する必芁がありたす—䞀方で、 julia-syntax.scmそれを正しく行うためのコヌドはすでにありたす。
  • 珟圚include_stringを䜿甚しおコヌドのブロック党䜓を評䟡し、最埌の匏の倀を取埗するIJuliaのようなものでは、さらに泚意が必芁です。 匏を匏ごずに解析するように切り替える必芁があるだけでなく、元の行番号を保持するために゚ラヌメッセヌゞなどのためにいく぀かのハッカヌが必芁になる堎合がありたす。 ただし、ここでも機胜する可胜性のある
  • include倖郚ファむルがAST倉換によっお捕捉されないずいう人々の堎合は蚀うたでもありたせん。

ただし、新しいより単玔なスコヌプ芏則ず、REPLスタむルの入力を受け取り、それを評䟡する前に倉換する倉換の芳点から説明する方が簡単なようです。

むンタラクティブな䜿甚や特定のフラグが付いたinclude堎合、ルヌルの遞択が難しいず蚀うよりも、これが新しいナヌザヌに説明しやすいのではないかず真剣に疑っおいたす。

globalize(::Module, ast)実装の倧たかなドラフトは次のずおりです https 

さお、行番号情報を保持するglobalize_include_string関数を実装する方法を理解し、それを私の芁点に远加したした。

人々がこのアプロヌチを奜む堎合、可胜な非砎壊的な前進の方法

  1. globalizeなどの関数を含むSoftGlobalScope.jlパッケヌゞをリリヌスしたす。
  2. IJuliaおよび堎合によっおはJuno、vscode、OhMyREPLでSoftGlobalScopeを䜿甚したす。
  3. SoftGlobalScope関数をREPLstdlibパッケヌゞの将来のリリヌスにフォヌルドし、REPLで䜿甚したす。

それずも、すぐにREPL.jlにロヌルむンするのが実甚的ですか 1.0でstdlibの曎新がどのように機胜するかに぀いおは完党にはわかりたせん。

壊れやすくなるようなものが欠けおいる堎合に備えお、私の実装を芋おください。

1.1のREPLのデフォルト以倖の機胜ずしおそれを䜿甚するこずはできたせんか

28523ず28750の耇補。 グロヌバル倉数に぀いお人々に教えたくないず蚀う人には、 forルヌプする前に、たず関数を教えるこずをお勧めしたす。 ずにかく関数はより基本的であり、これはコヌドが関数で曞かれるべきであるずいう期埅を蚭定するのに圹立ちたす。 䞍䟿さは理解しおいたすが、このスコヌピング動䜜は教育孊的な利点に倉わる可胜性がありたす。「実際、グロヌバル倉数は、特にルヌプで䜿甚する堎合は非垞に悪い考えであるため、蚀語を䜿甚するために埌ろ向きに曲がりたす。」

このためにデフォルト以倖の機胜をREPLに远加するこずは、私には問題ないようです。

@JeffBezanson 、私たちの倚くは、線圢代数や統蚈などの技術コヌスで、Matlabなどの代わりにJuliaを䜿甚したいず考えおいるこずを忘れないでください。 これらはプログラミングコヌスではなく、孊生はプログラミングのバックグラりンドを持っおいないこずがよくありたす。 構造化プログラミングを行うこずはありたせん。ほずんどすべおが短いスニペットずグロヌバル倉数を䜿甚しおむンタラクティブです。

さらに、私が最初に動的蚀語を䜿甚しおいる理由は、むンタラクティブな探玢ずより統制のずれたプログラミングを流動的に切り替えるためです。 グロヌバルコンテキストず関数コンテキストで同じコヌドを䜿甚できないこずは、抂念のスコヌプに慣れおいる人にずっおも、その目的を劚げるものであり、CS以倖のバックグラりンドを持぀孊生にずっおはさらに悪いこずです。

私たちの倚くは、線圢代数や統蚈などの技術コヌスで、Matlabなどの代わりにJuliaを䜿甚したいず考えおいるこずを忘れないでください。 これらはプログラミングコヌスではなく、孊生はプログラミングのバックグラりンドを持っおいないこずがよくありたす。 構造化プログラミングを行うこずはありたせん。ほずんどすべおが短いスニペットずグロヌバル倉数を䜿甚しおむンタラクティブです。

私たちJuliaナヌザヌの倚くは私を含めおCSのバックグラりンドがたったくありたせんが、適切な態床特に孊生にずっおは、私たちのナむヌブに察応するために状況を悪化させるこずを芁求するのではなく、孊ぶ意欲があるようです。

さお、私はここで䜕が起こっおいるのかに぀いおの理解が限られおいるので、この特定の倉曎が悪化するこずを必ずしも意味しおいたせんが、これが重倧な耇雑さであるか、䞍必芁に曞くのが過床に簡単になる堎合パフォヌマンスの悪いコヌドは、より良い講矩䟋を埗るために倉曎を加える䟡倀がないようです。 物理法則を倉曎しお、新入生に瀺す静電気の䟋を実際の生掻により適したものにするこずはできたせん。

したがっお、パフォヌマンスも気にする非CSナヌザヌずしおの私の質問は、これがデフォルトの動䜜にされた堎合、どのように倱敗する可胜性があるかずいうこずです。 問題があるのは文字通りここで芋おいる皮類の䟋だけですか私はすでに知っおいたした、それずももっず埮劙な方法でこれをひどく台無しにする可胜性がありたすか

䟡倀のあるこずずしお、コヌドを囲むスコヌプに応じお異なる動䜜をするこずは、䞀般的に望たしくない機胜であるこずに同意したす。

コヌドをむンタラクティブに曞くのを難しくし、最初のルヌプを曞く初心者にあいたいなスコヌプ芏則を理解させ、関数から貌り付けたコヌドをグロヌバルスコヌプで機胜させないようにするこずは、プログラマヌが関数で高速コヌドを曞くのに圹立ちたせん。 ゞュリアをむンタラクティブに䜿甚するのが難しくなり、初心者にずっおは難しくなりたす。

1.1のREPLのデフォルト以倖の機胜ずしおそれを䜿甚するこずはできたせんか

「unbreakme」オプションをデフォルトにする方が賢明なようです。特に、初心者ナヌザヌを真っ向から狙うオプションです。 それがデフォルト以倖のオプションである堎合、正確にそれを最も必芁ずする人々は、それを有効にしおいないそしおそれが存圚するこずを知らない人々です。

提案されたREPLモヌドはinclude edスクリプトに䜕をしたすか グロヌバルステヌトメントの評䟡は、REPLモヌドがアクティブになっおいるかどうかによっお異なりたすか もしそうなら、IMOこれは1.0の安定性の玄束ず察立するでしょう。

このようなこずをした堎合、モゞュヌルがどのように機胜するかを刀断するのは理にかなっおいるようです。 したがっお、 Mainは「゜フトスコヌプ」モゞュヌルになりたすが、デフォルトでは他のモゞュヌルは「ハヌドスコヌプ」モゞュヌルになりたす。

@stevengjのglobalize関数を䜿甚するようにREPLにモンキヌパッチを適甚するこずが可胜かどうかを確認するこずに興味がありたしたが、あたり劎力をかけなくおもよいようですかなりハッキヌですが。 芁旚をご芧ください。 これは、JunoたたはCore.eval盎接呌び出す他のものでは機胜したせん。

これを人々に勧める぀もりはありたせんが、迅速で汚いデヌタ分析を行うずきに非垞に圹立ちたす。 関数からREPLにコヌドをコピヌしお貌り付けお衚瀺できない堎合、経隓の浅い、しばしば消極的なコヌダヌ぀たり、私の孊生にずっおは非垞に混乱するため、よりよく考えられた゜リュヌションを非垞に望んでいたす。それが䜕をするのか、たたその逆も同様です。

julia> a = 0                                                                
0                                                                           

julia> for i = 1:10                                                         
         a += i                                                             
       end                                                                  
ERROR: UndefVarError: a not defined                                         
Stacktrace:                                                                 
 [1] top-level scope at .\REPL[2]:2 [inlined]                               
 [2] top-level scope at .\none:0                                            

julia> using SoftGlobalScope                                                
[ Info: Precompiling SoftGlobalScope [363c7d7e-a618-11e8-01c4-4f22c151e122] 

julia> for i = 1:10                                                         
         a += i                                                             
       end                                                                  

julia> a                                                                    
55                                                                          

ずころで䞊蚘はそれが持っおいたのずほが同じくらいのテストです

提案されたREPLモヌドは含たれおいるスクリプトに察しお䜕をしたすか

䜕もない。 基本的に、これはむンタラクティブなプロンプトで入力されたコヌドに察しおのみであるずいう提案です。 ファむルに物を入れ始めるずすぐに、「ハヌドスコヌプ」ルヌルを孊ぶ必芁がありたす。 うたくいけば、コヌドをファむルに入れ始めるずきは、関数の䜿甚を開始する必芁がありたす。

プロンプトよりもファむル内のグロヌバルコヌドのスコヌプルヌルが厳しくなるのは理想的ではありたせん。 しかし、19324ずJulia 1.0の安定性の玄束を組み合わせるず、理想的な遞択肢がなくなるず思いたす。

@stevengj 

@JeffBezanson 、私たちの倚くは、線圢代数や統蚈などの技術コヌスで、Matlabなどの代わりにJuliaを䜿甚したいず考えおいるこずを忘れないでください。 これらはプログラミングコヌスではなく、孊生はプログラミングのバックグラりンドを持っおいないこずがよくありたす。 構造化プログラミングを行うこずはありたせん。ほずんどすべおが短いスニペットずグロヌバル倉数を䜿甚しおむンタラクティブです。

Matlab / R / ...に以前に觊れたこずのある孊生に、Juliaを䜿甚しおコヌスを教えたこずがあるので、この懞念に共感したす。 しかし同時に、JuliaをMatlabなどの代替ずしお䜿甚するこずは実行可胜なアプロヌチではないず思いたす。DiscourseずStackOverflowに関する質問で䜕床も瀺されおいるように、これは修正ず理解が難しいパフォヌマンスの萜ずし穎に぀ながる可胜性がありたす。 Juliaがこれらの他の蚀語ずどのように異なるかを理解するために投資するよりもさらに倧きなコストがかかる可胜性がありたす「このコヌドをMatlabから翻蚳したが、10倍遅い」ずいうトピックの投皿を参照。

重芁な問題はサむレント障害だず思いたす。 問題自䜓は理解しやすく、修正も簡単です。 新しい動䜜を維持するこずをお勧めしたすが、 Main譊告を衚瀺したすデフォルトでは、無効にできるはずです。

私にずっお、より倧きな問題は、知芚される矛盟です。 ぀たり、私はゞュリアが別の方法で物事を行うこずに問題はありたせんが、次のようになりたす。

  • 関数から貌り付けたコヌドがREPLで機胜しないのはなぜですか
  • 私が今たで䜿甚した他の蚀語にはこの動䜜がありたせん、そしおそれは採甚ぞのもう䞀぀の障壁です
  • forブロックがbeginおよびifブロックず異なる動䜜をするのはなぜですか  if私はある皋床理解しおいたすが、ブロックは[あるべき]ブロックです。

箇条曞き2に関しおは、これは、ゞュリアをしばらく䜿甚しおいるそしお蚀語に取り組んでいる私たちが理解できるよりも倧きな問題だず思いたす。 私のグルヌプにJuliaでコヌドを曞くよう説埗するこずで、私は珟圚0察7であるず蚀えたす。 そのうちの2぀は、このforルヌプの問題が原因でしたが、これたでに觊れたこずがなかったため、説明できたせんでした。 残りの郚分は、カリスマ性の欠劂にチョヌクで曞くこずができるず思いたす。

私の奜みは、関数からREPLに貌り付けられたコヌドが関数ず同じように動䜜し、 forルヌプを䜿甚しおデヌタをむンタラクティブに分析するずきに期埅どおりの動䜜をするようにするこずです。 ぀たり、特別なキヌワヌドなしで指瀺された堎合、倖郚/グロヌバル倉数を倉曎したす。

ゞュリアをMatlabなどの代替ずしお䜿甚するこずは実行可胜なアプロヌチではないず思いたす。DiscourseずStackOverflowに関する質問で䜕床も瀺されおいるように、これは修正ず理解が困難なパフォヌマンスの萜ずし穎に぀ながる可胜性があり、さらに倧きなコストがかかる可胜性がありたすゞュリアがこれらの他の蚀語ずどのように違うかを理解するこずに投資するよりも。

申し蚳ありたせんが、この議論は私にはばかげおいたす。 私がプログラミングを教えおいるクラスに぀いお話しおいるのではありたせん。 単玔な察話型蚈算の堎所があり、CS以倖のクラスでは、最初に「栄光の蚈算機」ずしおプログラミング蚀語を玹介するのが䞀般的です。 Juliaでパフォヌマンスコンピュヌティングを教えるこずはたったく異なるプロセスですが、すでにJuliaを「蚈算機」ずしお䜿甚しおいる堎合でも問題はありたせん。

孊生に「蚈算機」ずしおMatlabを玹介するこずから始める堎合、圌らの最初の本胜は船に飛び乗る前にMatlabで可胜な限り倚くのこずを行うこずであり、その時点で圌らの悪い習慣があるため、「実際の」プログラミングに移行するこずははるかに困難です。圌らは根付いおおり、新しい蚀語を孊ぶこずに消極的です。 察照的に、栄光の蚈算機ずしおJuliaから始める堎合、より本栌的なプログラミングを行うずきは、はるかに幅広いオプションを利甚できたす。 すべおを「ベクトル」操䜜に詰め蟌むようにトレヌニングしたり、正しく実行する前にひどいこずを匷制したりする必芁はありたせん。

線圢代数のコヌスでゞュリアを䜿うべきではないず蚀っおいるのですか それずも、線圢代数だけでなくコンピュヌタサむ゚ンスを教える準備ができおいる堎合にのみ䜿甚する必芁がありたすか

私は@stevengjに、問題プログラマヌ以倖の人ぞの指導がはるかに難しくなるず解決策REPLずさたざたなIDEで機胜するようにするの䞡方に同意したす。 スクリプトを含めるず、Julia 1.0のスコヌプ芏則が適甚されたすが、それほど心配する必芁はありたせん。「forルヌプを関数に入れおから、関数を呌び出すこずができたす」クラスを「眮くこずができる」の前に眮くように泚意する必芁がありたす。ファむル内のforルヌプず、file "クラスを含めたす。

これは、REPLでのむンタラクティブなデバッグが必芁以䞊に苊痛にならないたたは新しいナヌザヌを混乱させるので、良い劥協のように聞こえたすが、スクリプトの通垞のコヌドは厳密なスコヌプルヌルに埓う必芁があり、バグが䞀郚を䞊曞きするこずはありたせん。誀っお倉数。

線圢代数のコヌスでゞュリアを䜿うべきではないず蚀っおいるのですか それずも、線圢代数だけでなくコンピュヌタサむ゚ンスを教える準備ができおいる堎合にのみ䜿甚する必芁がありたすか

あなたは私が蚀っおいるこずを誀解しおいるかもしれたせんたたは私はそれを明確に衚珟しおいたせんでした。 私は、CSコヌス私が経隓したこずのないではなく、ゞュリアを䜿甚しおドメむン固有の䜕かを教えるコヌスたずえば、倧孊院生に数倀的方法を教えたに぀いお話しおいたした。

私が蚀いたかったのは、Juliaず蚀語XMatlabの堎合もあるの間にある皋床の違いがあるず予想するのは合理的であるずいうこずです。 逆に、これを無芖するず問題が発生する可胜性がありたす実際に発生したす。

個人的に、新しい蚀語を孊ぶずき、私はこれらの問題に早い段階で盎面するこずを奜みたす。 たた、長期的には、他の蚀語ずの類䌌性よりも、蚀語セマンティクスの単玔さず䞀貫性の方が重芁だず思いたす。 しかし、私はこれらの奜みを䞻芳的なものずしお認識しおおり、合理的な人々は異なるものを持぀こずができたす。

未登録のパッケヌゞhttps://github.com/stevengj/SoftGlobalScope.jlを䜜成したした

これが劥圓ず思われる堎合は、先に進んでパッケヌゞを登録し、デフォルトでIJuliaで䜿甚できたすおそらく、JunoなどにPRを送信したす。

私が蚀いたかったのは、Juliaず蚀語XMatlabの可胜性があるの間にある皋床の違いを期埅するのは合理的であるずいうこずです。

明らかに。 「Matlabの代わりにJuliaを䜿甚する」ず蚀っおも、JuliaでMatlab構文を教えようずしおいるわけではなく、以前のMatlabナヌザヌを特に察象ずしおいるわけでもありたせん。

私はこれらの問題に早い段階で盎面するこずを奜みたす

Matlab自䜓ずの違いに぀いおではありたせん。 CS以倖の孊生の前で初めおルヌプを䜜成するずき、たたはCS以倖の孊生からコヌドを初めお貌り付けるずきは、グロヌバルスコヌプずロヌカルスコヌプ、および静的分析のためのglobalキヌワヌドの有甚性に぀いおは話したくありたせん。 REPLに機胜しお、むンタラクティブに詊しおください。 ルヌプを䜿っお衚珟しようずしおいる数孊に焊点を圓おたいず思いたす。

Matlabナヌザヌが期埅しおいるずいう理由だけで、ここでは誰も゜フトむンタラクティブスコヌプに぀いお議論しおいたせん。 、「スコヌプ」のなじみのない抂念ぞの長いを狂わせるこずため、私たちはそれを䞻匵しおいたす。 経隓豊富なナヌザヌでも、むンタラクティブに䜜業しおいるずきにglobalキヌワヌドを远加しなければならないのはかなり䞍䟿です。

ここで蚀及されおいないもう1぀の修正は、「for」でスコヌプブロックを定矩するのをやめるこずです関数だけで新しいスコヌプを䜜成できたす

@vtjnash 、私はむしろこの議論を前にできるこず

良い点ですが、これにもimport Future.scope必芁です😀

このモゞュヌル/名前空間/行動効果はすでに予玄されおいる/存圚しおいるず思いたす

ここでの泚意点ずしお、倉曎は、そのモゞュヌルで以前に評䟡されたものに関係なく、すべおのグロヌバルスコヌプ環境でコヌドが同じように動䜜するこずを保蚌するこずでした。 この倉曎の前は、同じコヌドを2回実行するか、ファむル内で移動するだけで、スコヌプの割り圓おが異なるためにたったく異なる回答を埗るこずができたした。

この倉曎の前は、同じコヌドを2回実行するか、ファむル内で移動するだけで、スコヌプの割り圓おが異なるためにたったく異なる回答を埗るこずができたした。

実際にそれに぀いお私が芋た苊情の数れロは、珟圚の行動に぀いおあなたが芋るそしおすでに芋おいる苊情ず混乱の数によっお確実に矮小化されおいたす。

この倉曎の前は、同じコヌドを2回実行するだけで、スコヌプの割り圓おが異なるためにたったく異なる回答を埗るこずができたした。

以䞋のコヌドで、 aが最初のforルヌプず2番目の

a = 0
for i = 1:5
  a += 1
end

for i = 1:5
  a += 1
end

提案されたREPLモヌドは含たれおいるスクリプトに察しお䜕をしたすか

@ mauro3 @stevengj関数たずえば、 exec("path/to/script.jl") の远加は、マむナヌバヌゞョンのバンプだけで実行できるず思いたすか たた、 exec 'edスクリプトから別のファむルをexec 'に譊告し、そこにいく぀かの教育メッセヌゞを入れお、 includeを䜿甚するように促すこずもできたす。

昚倜、この問題に頭を悩たせながらもう䞀床、最善の行動方針を芋぀けようずしお曞き留めた考えがいく぀かありたす。 結論はありたせんが、これは問題を非垞に明確に瀺しおいるず思いたす。 この問題に぀いお数幎間考えた埌、「理想的な解決策」はないず思いたす。これは、最適ではない遞択肢しかない問題の1぀である可胜性がありたす。


人々は、グロヌバルスコヌプをロヌカルスコヌプを囲む面癜い皮類ずしお玠朎に芋おいたす。 これが、グロヌバルスコヌプがJulia0.6以前ず同じように機胜した理由です。

  • 倖郚ロヌカルスコヌプがロヌカル倉数を䜜成し、内郚ロヌカルスコヌプがそれに割り圓おた堎合、その割り圓おによっお倖郚ロヌカル倉数が曎新されたす。
  • 倖郚グロヌバルスコヌプがグロヌバル倉数を䜜成し、内郚ロヌカルスコヌプがそれに割り圓おる堎合、その割り圓おは以前に倖郚グロヌバル倉数を曎新したした。

ただし、䞻な違いは次のずおりです。

  • 蚭蚈䞊、倖郚ロヌカル倉数が存圚するかどうかは、倖郚ロヌカルスコヌプ内の匏の出珟順序や実行に䟝存したせん。
  • ただし、グロヌバル倉数が存圚するかどうかは、グロヌバルスコヌプで匏を䞀床に1぀ず぀評䟡するため、順序に䟝存するこずはできたせん。

さらに、グロヌバルスコヌプは非垞に長いこずが倚く、耇数のファむルにたたがるこずはめったにありたせん。匏の意味が他の匏に䟝存しおいるため、匏から任意の距離にあるず、「離れた堎所での䞍気味なアクション」効果になり、非垞に望たしくありたせん。 。


この最埌の芳察結果は、グロヌバルスコヌプでforルヌプの2぀の異なるバヌゞョンが異なる動䜜をする理由を瀺しおいたす。

# file1.jl
for i = 1:5
  a += 1
end
# file2.jl
a = 1



md5-f03fb9fa19e36e95f6b80b96bac9811e



```jl
# main.jl
include("file1.jl")
include("file2.jl")
include("file3.jl")

たた、 file1.jlずfile3.jlは同䞀であり、毎回異なる意味ず動䜜で同じファむルを2回含めるこずで、䟋を簡略化できるこずにも泚意しおください。

もう1぀の問題のあるケヌスは、長時間実行されるREPLセッションです。 オンラむンのどこかから䟋を詊しおみたせんか この䟋でforルヌプたたは同様の構造のロヌカル倉数に䜿甚しおいるのず同じ名前のグロヌバル倉数があるため、倱敗したす。 したがっお、混乱を匕き起こす可胜性があるのは新しい動䜜だけであるずいう考えは、間違いなく正確ではありたせん。 新しい動䜜がREPLのナヌザビリティの問題であるこずに同意したすが、䌚話を和らげ、ここで反察偎を明確に提瀺したいず思いたす。

私の小さな提案は、replの問題を扱っおいたせんが、蚀語を非察話的に教えるずきに教蚓的な目的に圹立ちたす。少なくずも、Fortranで実行できるように「program」ずいう名前のメむンブロックを定矩したすこれは䞊蚘の「let ... end」ず同じですが、より自然な衚蚘がありたす

プログラムテスト
..。
終わり

スコヌプの詳现に立ち入るこずなく蚀語を教え、最終的にその点に぀いお話し合うこずしかできたせんでした。

もう1぀の問題のあるケヌスは、長時間実行されるREPLセッションです。 オンラむンのどこかから䟋を詊しおみたせんか この䟋でforルヌプたたは同様の構造のロヌカル倉数に䜿甚しおいるのず同じ名前のグロヌバル倉数があるため、倱敗したす。

動揺しおいるナヌザヌから、これに関しおメヌリングリストの苊情やgithubの問題がいく぀提出されおいたすか れロ、私の数では。 どうしお おそらく、この振る舞いは基本的に人々ないためです。グロヌバルスコヌプで䜜業する堎合は、グロヌバルな状態に䟝存したす。

したがっお、混乱を匕き起こす可胜性があるのは新しい動䜜だけであるずいう考えは、間違いなく正確ではありたせん。

これは誀った等䟡関係だず思いたす—ここでは朜圚的な混乱のレベルに倧きな違いがありたす。 Julia 0.6では、あなたの䟋を数秒で生埒に説明できたす。「ああ、このルヌプはここで倉曎したaに䟝存しおいるのを芋おください。」 Julia 1.0では、線圢代数の講矩の最䞭に、単語を聞いたこずがない孊生の前で䞍思議なこずにglobalキヌワヌドを入力しなければならない堎合、どうなるかを正盎に心配しおいたす。 CSの意味での「スコヌプ」。

数幎以内にスコヌプルヌルを倉曎するこずを真剣に怜蚎する必芁がありたす。

絶察違う。 ルヌプスコヌプのv0.2より前の䞖界1571ず330を参照に真剣に戻りたいですか

実際、関数から行ごずのREPLぞのコヌドのコピヌず貌り付けを完党にサポヌトしたこずはありたせん。 したがっお、これをそれを機胜させる機䌚ず芋なすこずができたす。 具䜓的には、 forルヌプでは「機胜」したしたが、内郚関数では機胜したせんでした。

x = 0
f(y) = (x=y)

関数内で、 fは最初の行からxを倉曎したす。 REPLではそうではありたせん。 しかし、SoftGlobalScope.jlのような倉換を䜿甚するず、機胜する可胜性がありたす。 もちろん、スタンドアロンの関数定矩を貌り付けるこずは機胜しないため、デフォルトではオンにしたくないでしょう。 最初に頭に浮かぶのは、行ごずの関数デバッグのためのREPLモヌドです。

v0.2より前の䞖界に真剣に戻りたいですか

いいえ、0.6の䞖界に戻りたいです。 😉

私はもっ​​ず反応しおいたず思いたす

ここで蚀及されおいないもう1぀の修正は、スコヌプブロックを定矩するための「for」の䜜成を単に停止するこずです。

実際、関数から行ごずのREPLぞのコヌドのコピヌず貌り付けを完党にサポヌトしたこずはありたせん。 したがっお、これをそれを機胜させる機䌚ず芋なすこずができたす。

私はこの感情に非垞に感謝しおおり、私のナヌスケヌスにずっおは本圓に圹に立ちたす。 私の芋解では、蚀語のスコヌプ芏則を盎接倉曎するのではなく、REPLを可胜な限り有甚にするこずが重芁です。

ずは蚀うものの、この問題に぀いお考えれば考えるほど、REPLが䜕をすべきかに぀いお私が個人的に抱いおいる矛盟する芋解を芋るようになりたす。

具䜓的には、REPLが関数本䜓のスコヌプ芏則ず䞀臎しおいれば非垞に気に入っおいたす。 ぀たり、倉数はグロヌバルではなくロヌカルであり、関数から盎接コヌドをコピヌしお貌り付けるだけで、それが機胜するこずがわかりたす。 ナむヌブな実装は、フォヌムのlet-blockラッピング前述のずおりのようなものになるず思いたす

julia> b = a + 1

に倉換されおいたす

let a = _vars[:a]::Float64 # extract the variables used from the backing store
    # Code from the REPL
    b = a + 1
    # Save assigned variables back to the backing store
   _vars[:b] = b
end

適切に぀たり、圌らが䜕をしおいるのかを知っおいる誰かによっお行われるず、これは既存のREPLよりも倚くの利点があるず思いたす。 1.むンタラクティブなデヌタ分析/蚈算を䜿甚した以前のワヌクフロヌは正垞に機胜したす。 2.基本的な応答が「グロヌバル倉数によるベンチマヌクを停止する」であるDiscourseぞの投皿がはるかに少ない-すべおがロヌカルであり、うたくいけば高速です :) 3.関数本䜓ずの間のコピヌアンドペヌストは、期埅どおりに機胜したす。 4.バッキングストアがある皮のDictである堎合、 workspace()ような関数は簡単です。 ただそれを片付けなさい。 5.グロヌバルは明瀺的になりたす-特にグロヌバルであるように芁求しない限り、物事はロヌカルです。 これは私の芳点からは倧きな利点です。暗黙的にグロヌバルを䜜成するのは奜きではありたせん。 非垞にマむナヌな最埌のポむントそしおこれを远加するこずを躊躇したす、これはMatlabの動䜜ず䞀臎し、移行を容易にしたす-Matlab REPLでは、グロヌバルずしお明瀺的に泚釈が付けられおいない限り、すべおの倉数がロヌカルのように芋えたす。

数時間前たで、この話は私には玠晎らしいず思いたした。 しかし、関数に぀いおのJeffのコメントの埌、スタンドアロンの関数定矩に貌り付けるこずず、関数定矩はグロヌバルスコヌプに入る必芁があるため、このアプロヌチが基本的にそれをどのように防ぐかに぀いお考えたした少なくずも、それはおそらく意図されたものです。 しかし、それらがロヌカルスコヌプ内郚関数に入るこずいた堎合はどうなるでしょうか 2぀の可胜性を明確にするための情報はありたせん。 2぀のREPLモヌドが必芁であるように思われたす。1぀はロヌカルスコヌプ、もう1぀はグロヌバルスコヌプです。 䞀方では非垞に混乱する可胜性がありたすが談話の投皿を想像しおください...、他方では非垞に圹立぀可胜性がありたす。 新しい機胜を導入しおいるだけなので、䞡方のREPLモヌドを䜿甚しおも問題はありたせん:)

SoftGlobalScope.jlの䞭間の家に行くこずは、最も混乱の少ない劥協案になるかもしれたせんが、私の心配は、それが芚えおおくべき別のルヌルのセットにすぎないこずですこれはREPLで機胜したすが、関数本䜓/グロヌバルスコヌプでは機胜したせん。逆に。

長い投皿をお詫びしたすが、これは䜿いやすさにずっお重芁だず思いたすそしおそれは私がそれを熟考するのに圹立ちたした。

動揺しおいるナヌザヌから、これに関しおメヌリングリストの苊情やgithubの問題がいく぀提出されおいたすか れロ、私の数では。 どうしお おそらく、この振る舞いは基本的に人々にずっお驚くべきこずではないためです。グロヌバルスコヌプで䜜業する堎合は、グロヌバルな状態に䟝存したす。

うヌん、あなたは本圓にこれに぀いお䜓系的な研究をしたしたか 私はそれを逃したに違いない。 それでも、これは、この動䜜がバグや予期しない結果の原因ではないこずを意味するものではありたせん。 ナヌザヌがそれを理解した埌、それは正しい動䜜ずしお認識されたため、問題/苊情を促したせんでした。

Julia 1.0では、線圢代数の講矩の最䞭に、グロヌバルキヌワヌドを䞍思議に入力しなければならない堎合にどうするかを正盎に心配しおいたす。

私はこの問題に同情したす。 コヌスに必芁なeconの孊生に簡単なプログラミングを教えたずき、私は通垞、関数でコヌドをラップし、 functionずendをコメントアりトしお実行するこずを行ったり来たりするこずを提案したした。グロヌバルスコヌプで、圌らは䜕が起こっおいるのかを調べるこずができたす。 これは、圓時のJuliaでのデバッグむンフラストラクチャの欠劂をほが埋め合わせたした。

このアプロヌチはもはや実行可胜ではないようです。 しかし、ずにかくそれが本圓に正しい方法だったのだろうかず思いたす。その間に、さたざたなこずが倧幅に改善されたした265が修正され、 Revise.jlず最近Rebugger.jによっおワヌクフロヌ/デバッグが倧幅に改善されたした。

この問題は経隓豊富なナヌザヌをあたり気にしないようです。䞻な懞念は教育環境での混乱です。 私はただこれを実隓しおいたせんが、代わりに教育ぞのアプロヌチを適応させるこずができるかどうか疑問に思いたす。たずえば、ルヌプの前に関数を導入し、グロヌバルスコヌプでルヌプを回避したす。 これらはずにかく良いスタむルの芁玠であり、孊生に利益をもたらすでしょう。

ちょっずした泚意REPLのグロヌバルスコヌプを特別に倧文字にするず、関数ずの間でコヌドをコピヌしお貌り付けるこずができたすが、別のモゞュヌルのグロヌバルスコヌプずの間でコピヌを貌り付けるこずはできたせん。

代わりに、ルヌプの前に関数を導入したり、グロヌバルスコヌプでルヌプを回避したりするなど、教育ぞのアプロヌチを適応させるこずができるでしょうか。

これは、プログラミングの指導に焊点を圓おおいないクラスではたったく実甚的ではありたせん。 むンタラクティブに䜿甚できない堎合や、最初にすべおの関数を䜜成する必芁がある堎合は、クラスでJuliaを䜿甚しない方がよいでしょう。

そしお、それは教育的なだけではありたせん。グロヌバルスコヌプのルヌプはむンタラクティブな䜜業に圹立ちたす。テクニカルコンピュヌティング甚の動的蚀語が奜きな䞻な理由の1぀は、むンタラクティブな探玢のための機胜です。すべおのコヌディングがパフォヌマンス指向であるずは限りたせん。

䜕十幎にもわたっお、人々が叀い「゜フト/ハヌドスコヌプ」の区別に぀いお混乱したり䞍平を蚀ったりするスレッドや問題が数十ありたす。したがっお、叀い動䜜に぀いお誰も混乱したり䞍平を蚀ったりしたこずがないず䞻匵するのは...違いたす。 私はそれらのいく぀かを掘り起こすこずができたしたが、あなたは@stevengjの呚りにいたので、あなたはそれらを同じように簡単に掘り起こすこずができ、あなたがこれらの䞍満や䌚話に気づかなかったか芚えおいなかったずは信じられたせん。

@StefanKarpinski 、私は特に、グロヌバルルヌプがグロヌバル状態に䟝存しおいるず䞍平を蚀っおいる人々に蚀及しおいたす。 これが悪い行動だったず䞍平を蚀った人は誰も芚えおいたせんし、その䟋も芋぀かりたせん。

割り圓おが新しい倉数を定矩する時期ず堎所に぀いお人々が混乱しおいるこずに同意したすが、通垞は逆の方向にありたす。ロヌカルスコヌプがその逆ではなくよりグロヌバルに動䜜するこず、たたはbegin区別しないこずを望んでいlet 。 IIRC、䞍満は、グロヌバルルヌプ内のグロヌバル倉数ぞの割り圓おがグロヌバルを倉曎するずいう驚くべき副䜜甚を持っおいるずいうこずではありたせんでした。

スコヌピングの問題党䜓は、新しいナヌザヌを混乱させるものであり、今埌もそうなり続けるでしょう。 しかし、玛らわしい郚分は、グロヌバル倉数名ぞの割り圓おがグロヌバル状態に圱響を䞎える堎合ではありたせんでした。 珟圚の動䜜はこれを悪化させたすが、良くはありたせん。

@StefanKarpinski 以前は、゜フト/ハヌドスコヌプずの混同は、予期しない結果を埗る人々の実際的なものではなく、マニュアルを読む人々の理論的な性質であったず感じおいたす。 それは間違いなく私にずっおのこずであり、たずえば、ここでの怜玢結果た。

䞀方、この新しい動䜜は、マニュアルを読むずきではなく、REPLを䜿甚するずきに人々を混乱させるこずはありたせん。 おそらく埌者の方が悪いです。

SoftGlobalScope.jlが登録枈みパッケヌゞになりたした。 私の意図は、少なくずも今孊期は、IJuliaでデフォルトで有効にするオプトアりトするこずです。

@ mauro3 、あなたの「反䟋」でさえ、゜フトスコヌプではなくハヌドスコヌプによっお混乱しおいる誰かに぀いおです。 0.7でより倚くのスコヌプを「ハヌド」にするこずは、この皮の混乱をさらに匕き起こすこずは確実です。

IJuliaには、デフォルトで倉数をロヌカルdoブロックにするずいう興味深い可胜性があるこずを指摘しおおきたす。 ぀たり、これを1぀のブロックで行うず、次のように機胜したす。

t = 0
for i = 1:n
    t += i
end
t

...そしおtは、この評䟡ブロック内でのみ衚瀺されたす。 倖に衚瀺したい堎合は、次のようにする必芁がありたす。

global t = 0
for i = 1:n
    global t += i
end
t

たた、ブロックがモゞュヌルではなくファむルであるJuliaの同様のアプロヌチも怜蚎したした。 ぀たり、トップスコヌプでt = 0を実行するだけで、グロヌバルではなくファむルロヌカルの倉数が䜜成されたす。 真のグロヌバル倉数を宣蚀するには、 global t = 0を蚘述する必芁がありたす。これは、モゞュヌル党䜓で衚瀺されたす。 おそらくあたりにも奇劙ですが、それは䜕幎にもわたっお䜕床も私に起こりたした。

IJuliaには、倉数をデフォルトでロヌカルdoブロックにするずいう興味深い可胜性がありたす

@StefanKarpinski 、これはさらに混乱を招き、ノヌトブックの通垞の䜿甚方法に反するず思いたす。 同じ倉数が耇数のセルで䜿甚/倉曎されるこずは䞀般的であるため、すべおのセル間倉数にglobalキヌワヌドを芁求するこずは、私にずっおは初心者ではありたせん。問題よりもスコヌプの抂念に぀いおさらに倚くの議論が必芁になりたす。ここで説明しおきたforルヌプを䜿甚したす。

私たち党員が同意する限り---私たちがそう思われるように---これはほずんどたたは完党に盞互䜜甚の問題であるず私は思いたす、そしお私たちは前進する方法がありたす。 これをREPLで特別な堎合IJuliaで行われおいるように、唯䞀の悪いケヌスは、REPLで䜕かを開発し、それをトップレベルのスクリプトコヌドに移動するこずです。 おそらくそれが関数を導入すべきポむントなので、それほど悪くはないず思いたす。 REPLず関数本䜓の間でコヌドをコピヌしお貌り付けるこずはほずんど機胜したすが、これでおそらく十分です。

次に、REPL倉数を䜕らかの方法でREPLに察しおロヌカルにするこずで、区別をさらに正圓化/明確化するオプションもありたす。぀たり、通垞のグロヌバル倉数ではなく、 Main.xずしお䜿甚できたせん。 これは、 @ StefanKarpinskiが䞊蚘で提案したものず非垞に䌌おい

実甚的な芳点から、REPLでこれを「修正」するこずはできたせん
教育/プログラマヌ以倖のナヌザヌにずっおのみ重芁です。 この振る舞いも
パヌツをコピヌしお貌り付けるこずによりREPLを介したむンタラクティブなデバッグを非垞に行いたす
実甚的ではありたせん。 このデバッグモヌドが望たしい堎合がありたす
優れたデバッガヌず経隓豊富なプログラマヌにずっおもそしお倚くの堎合、
動的蚀語を奜む理由。 もちろん経隓者のために
プログラマヌは、オプションであるこずは問題ではありたせん。 初心者ナヌザヌの堎合は
できればデフォルトです。

@StefanKarpinski
玠朎なプログラマヌずしお、私は実際に䜕がそんなに悪いのかわかりたせん。
特に動的な堎合に、ロヌカルスコヌプを囲む面癜い皮類ずしおのグロヌバルスコヌプ
蚀語。 コンパむラの芳点からはそうではないこずを私は理解しおいたす
必然的に正しいゞュリアでが、それは玠晎らしく、簡単で䟿利なモデルです
ナむヌブなプログラマヌのために。 私はそれが実際にそのように実装されおいるかもしれないず思う
䞀郚の蚀語。
ゞュリアはたた、それをプログラマヌにそのように提瀺しおいるようです。
次の関数関数は、「定矩されおいたせん」ずいう゚ラヌを出したす。
forルヌプの前にa = 1が蚭定されおいる堎合は、実行されたせん。

機胜テスト
i = 1:10の堎合
a = a + i
終わり
a = 1
@show a
終わり

これは、私が完党に誀解しない限り、「
倖偎のロヌカル倉数は、蚭蚈䞊、次の順序に䟝存したせん。
倖偎のロヌカルスコヌプでの匏の出珟たたは実行」。

私は「遠隔䜜甚」を避けるこずに非垞に同意したす。
関数/呌び出しスタックでグロヌバルを䜿甚するための明瀺的な定矩を優先する
レベルであり、個人的にはファむルからロヌドするようなものが欲しい
独自のスコヌプであり、グロヌバル倉数を䜿甚するための明瀺的な定矩が必芁です。
ルヌプのレベルでは、私にずっおは少し遠いですが、
定矩/コンテキストは通垞​​、かなり近いです。
3぀のファむルの䟋は少し䞍自然ですそしお期埅される「ではない」で倱敗したす
定矩枈み」゚ラヌ通垞、最初の定矩を同じものに入れたす
ファむル。
これには実際に䞍気味な危険がありたすそしお私はそれに噛たれたした
他の蚀語でむンクルヌドはグロヌバルスコヌプで実行されるため、
他の人に干枉する可胜性のあるグロヌバル倉数を誀っお定矩しおいる
コヌド。 ただし、ルヌプでグロヌバルを䜿甚する必芁があるこずは、
この問題。

長時間実行されるREPLセッションぞの曞き蟌み
珟圚の動䜜は、非垞にたれで簡単に特定できる障害モヌドに眮き換わるものです。
REPLでオンラむンの䟋を実行するためコピヌ/貌り付けを芋逃しおいる
ルヌプの前の倉数の初期定矩であり、すでに
以前のものからグロヌバルに定矩された同じ倉数
関数の䞀郚である堎合、オンラむンの䟋を正しく実行できたす
どこにでもグロヌバルを远加せずに、問題が解決しない堎合
そうではありたせんグロヌバルがオンラむンコヌドにすでに存圚する堎合でも、
既存のグロヌバル倉数の倀が間違っおいたす

私はもっ​​ず早くこれに耳を傟けるべきでしたが、少し心配した埌、すべおが順調に芋えたす。

実際、関数から行ごずのREPLぞのコヌドのコピヌず貌り付けを完党にサポヌトしたこずはありたせん...最初に頭に浮かぶのは、行ごずの関数デバッグ甚のREPLモヌドです。

実際、Rebuggerたさにそれですは、スコヌプの非掚奚である0.7がなく、0.6で動䜜させるこずができなかったずいう理由だけで、1.0で正しく動䜜したす。 ただし、SoftGlobalScope.jlがそれを壊しおいないように芋えるこずを確認できおうれしいです。 たずえば、 show([1,2,4])十分深く螏み蟌むず、次のようになりたす。

show_delim_array(io::IO, itr::Union{SimpleVector, AbstractArray}, op, delim, cl, delim_one) in Base at show.jl:649
  io = IOContext(Base.TTY(RawFD(0x0000000d) open, 0 bytes waiting))
  itr = [1, 2, 4]
  op = [
  delim = ,
  cl = ]
  delim_one = false
  i1 = 1
  l = 3
rebug> eval(softscope(Main, :(<strong i="10">@eval</strong> Base let (io, itr, op, delim, cl, delim_one, i1, l) = Main.Rebugger.getstored("bbf69398-aac5-11e8-1427-0158b103a88c")
       begin
           print(io, op)
           if !(show_circular(io, itr))
               recur_io = IOContext(io, :SHOWN_SET => itr)
               if !(haskey(io, :compact))
                   recur_io = IOContext(recur_io, :compact => true)
               end
               first = true
               i = i1
               if l >= i1
                   while true
                       if !(isassigned(itr, i))
                           print(io, undef_ref_str)
                       else
                           x = itr[i]
                           show(recur_io, x)
                       end
                       i += 1
                       if i > l
                           delim_one && (first && print(io, delim))
                           break
                       end
                       first = false
                       print(io, delim)
                       print(io, ' ')
                   end
               end
           end
           print(io, cl)
       end
       end)))
[1, 2, 4]

したがっお、1.0では正垞に動䜜したす softscope有無にかかわらず。 0.7では、これを評䟡するず softscope有無にかかわらず、次のようになりたす。

┌ Warning: Deprecated syntax `implicit assignment to global variable `first``.
│ Use `global first` instead.
└ @ none:0
┌ Warning: Deprecated syntax `implicit assignment to global variable `first``.
│ Use `global first` instead.
└ @ none:0
[ERROR: invalid redefinition of constant first
Stacktrace:
 [1] top-level scope at ./REBUG:9 [inlined]
 [2] top-level scope at ./none:0
 [3] eval(::Module, ::Any) at ./boot.jl:319
 [4] top-level scope at none:0
 [5] eval at ./boot.jl:319 [inlined]
 [6] eval(::Expr) at ./client.jl:399
 [7] top-level scope at none:0

したがっお、0.7 / 1.0は間違いなく䞀歩前進であり、 softscopeするず、重芁な機胜を壊すこずなく特定の䜜業が簡単になりたす。

したがっお、最倧の懞念は、他のパッケヌゞをタンキングせずにこれを適切にむンタヌセプトする方法ですhttps://github.com/stevengj/SoftGlobalScope.jl/issues/2。

@ timholy 、SoftScopeはマクロ呌び出しの匕数に觊れないためマクロがどのようにそれを曞き換えるかを知る方法がないため、 :(<strong i="6">@eval</strong> ...)は保護されたす。

「かどうか
倖偎のロヌカル倉数は、蚭蚈䞊、次の順序に䟝存したせん。
倖偎のロヌカルスコヌプでの匏の出珟たたは実行」。

倖郚ロヌカル倉数a存圚したすが、ただ割り圓おられおいたせん。 ルヌプがそれを読み取る前にaに割り圓おようずした堎合、割り圓おは倖郚にも衚瀺されたす。

䞀般に、倉数バむンディングの䜜成ずそれに倀を割り圓おるこずは別々のステップです。

これのタむムラむンは䜕ですか ナヌザヌの䜿いやすさが倧幅に向䞊するようです。 そしお、1.0が出たJuliaのこの「重芁な」時期に、この修正されたできるだけ早く䞊蚘のJeffによっお提案された方法で取埗し、新しいJuliaバヌゞョンたたはREPLバヌゞョンにタグを付けるこずが有利であるように思われたす。 私は確かにこれを修正しないので、このアヌムチェアのコメントは申し蚳ありたせん

@ゞェフベザン゜ン
これは実装/コンパむラヌにずっお真実ですが、玠朎なゞュリアプログラマヌは圌のより単玔な抂念モデルず異なる振る舞いを芋るこずができないず䞻匵しようずしたした倉数は定矩された瞬間に存圚し始めたす。 残念ながら、あなたは正しいです、次のコヌドぱラヌを出したせんが、最埌にa = 2を省略した堎合ぱラヌを出したす
機胜テスト
i = 1:10の堎合
a = 1
終わり
printlna
a = 2
終わり
残念ながら説明したす。動䜜は理解できたすが以前にコンパむル蚀語を䜿甚したこずがあるため、それでも混乱を招き、予期しないこずがわかりたす。 スクリプトの経隓しかない人やプログラミングに䞍慣れな人にずっお、それはどれほど悪いこずでしょう。 たた、動䜜を瀺すコヌドをいく぀か芋぀けたしたが、䟿利なアプリケヌションが芋぀かりたせん倚分あなたはそこで私を助けるこずができたす

REPLに぀いお
少なくずもREPLでスコヌプを「通垞」に戻すこずルヌプにグロヌバルを远加する必芁はないが優先床が高いこずを確信したした。今日REPLでいく぀かのこずをテストしおいお、再び噛たれたした。それを実珟するのに少し時間がかかりたす。 私がすでにゞュリアをフォロヌしおいるこずを考えるず、本圓に倚くの人が奜きで、問題に぀いおこのスレッドをフォロヌしおいたす、私はそれをショヌトッパヌず呌ぶこずさえありたす蚀語をテストするゞュリアぞのニュヌビヌは芋぀けるこずができない可胜性が非垞に高いです問題を解決し、ただあきらめたす。

@jeffbezansonず私は䞡方ずも埅望の䌑暇䞭です私はこれを読むべきではありたせん。 私たちは䞀週間かそこらで䜕をすべきかを理解するこずができたす。

@derijkp 、フィヌドバックは高く評䟡されおいたすが、スコヌピングルヌルはより広範な議論や改蚂に察応しおいたせん。 テヌブルにあるのは、特別なケヌスのむンタラクティブな評䟡だけです。 SoftGlobalScopeパッケヌゞはすでに優れた実隓的実装であり、Baseのその郚分を䜜成し、REPLで䜿甚するだけの問題かもしれたせん。

@derijkp簡単に蚀うず、倉数のスコヌプが䜕らかのブロック構造関数やルヌプの本䜓などに察応しおいる方が簡単だず思いたす。 あなたの提案では、倉数のスコヌプはブロックのサブセットになりたすが、これは最終的にはより耇雑で混乱を招くず思いたす---倉数のスコヌプに察応する構文圢匏を指すこずはできたせん。

はい、これは䞀郚の人々の盎感のミスマッチであるず私は信じるこずができたす。 ただし、蚀語を䜿甚しおから最初の10分間は、ある皋床たでしか最適化できたせん。 本圓の問題は、それがどのように機胜するかを教える/孊ぶのがどれほど難しいか、そしおどのデザむンが長期的に時間を節玄するか蚀語を単玔にする、ツヌルの開発を容易にするなどですか

REPLの動䜜の倉曎に関する䞊蚘の倚くに同意したす
REPLがこのスタックオヌバヌフロヌの質問に぀ながらない方法であるようにしたいず思い
倚くの新しい目がゞュリアを芋おいるので、早くするのが最善でしょう

同意したす...たた、スコヌプルヌルは必ずしも倉曎されるべきではなく、すべおのむンタラクティブむンタヌフェむス぀たり、REPL、Jupyter、およびJunoコントロヌルが入力されたすだけが倉曎される必芁があるず思いたす。

これは、初心者が新しいルヌルを孊ぶこずだけではありたせん。 コヌドのフラグメントをコピヌしおREPL、jupyterなどに貌り付けるこずができず、関数にも貌り付けるこずができない堎合、それは䞭玚プログラマヌにずっおも倧きな迷惑です。

もちろん、私は他のポスタヌにも同意したす...初心者の堎合、関数内で芋たコヌドフラグメントを取埗し、Iをスクリプトにコピヌし、関数内でコピヌしたずきに同じ動䜜をしないず完党に混乱したす、juno、repl、jupyterで。 同じ問題に垰着する100のスタック亀換の質問がありたす。 䞭玚のプログラマヌは、 letブロックなどでラップする、あらゆる皮類の自家補゜リュヌションを䜿甚するこずになりたす。これにより、事態はさらに混乱したす。

同じ問題に垰着する100のスタック亀換の質問がありたす。 䞭玚のプログラマヌは、 letブロックなどでラップする、あらゆる皮類の自家補゜リュヌションを䜿甚するこずになりたす。これにより、事態はさらに混乱したす。

可胜性はありたすが、この段階ではこれは架空のものですリンクされた質問のOPも、混乱するのではなく、スコヌプルヌルの論理的根拠に぀いお質問しおいたす。

たた、これを心配しおいるすべおの人の教育経隓を尊重したすが、これが教宀で倧したこずになるかどうかは、時が経おばわかるこずです。

質問者はそれによっお混乱しおいるようです「これは初心者のゞュリアナヌザヌにずっお盎感的であるかどうか疑問に思いたす。私にずっおは盎感的ではありたせんでした...」

質問者はそれによっお混乱しおいるようです

蚀うたでもなく、これはスコヌプのニュアンスを理解するのに十分なプログラミング蚀語を明確に知っおいる人です。 これらのトピックを完党に知らないすべおのmatlabタむプのナヌザヌはどうでしょうか...そしおおそらくニュアンスを理解するのに十分な時間を費やすこずは決しおないでしょう。

おそらく、しかしこの段階ではこれは架空のものです

私はすでにstackoverflowでこれに関連する耇数の質問に回答したしたが、䞻に新芏ナヌザヌによるものであり、実際にはさらに倚くの質問に回答したした最埌の質問は、昚日、これをノヌゎヌず芋なしたMatlabナヌザヌからのものです。

同じ問題に垰着する100のスタック亀換の質問がありたす。

私の「暇な時間」では、SEの質問にscope 、 scoping 、およびglobal-variablesタグを远加しおいたす。 私は時間の䞍足のために停止するだけで、それ以䞊ないからではありたせん。

トリアヌゞを含む倚くの議論の埌の結論BaseにSoftGlobalScopeの線に沿っお䜕かを含め、REPLおよび他のすべおのむンタラクティブな評䟡コンテキストでそれを䜿甚したす。 @JeffBezansonは、これが実装される方法は、実際には゜フトスコヌプが以前に実装された方法ず本質的に同じであるず指摘しおいるため、完党に䞀巡しおいたす。 違いは、モゞュヌルやスクリプトにはスコヌプの動䜜がなく、REPLのようなコンテキストでのみ動䜜するこずです。 たた、゜ヌスの曞き換えずしおの_explaining_゜フトスコヌプは、ハヌドスコヌプず゜フトスコヌプを区別しようずするよりも明確だず思いたすこれは、Jeffがどのように説明したかはわかりたせんが、指摘するかもしれたせん。

これらの2぀のステヌトメントは、少し矛盟しおいるように芋えるため、少し混乱したす。

そしおそれをREPLず他のすべおのむンタラクティブな評䟡コンテキストで䜿甚したす

[...]スクリプトにはスコヌプの動䜜はなく、REPLのようなコンテキストでのみ動䜜したす。

これは、モゞュヌルMain゜フトスコヌプREPLプロンプトなどずハヌドスコヌプ julia -L script.jl がある堎合があるこずを意味したすか Main垞に゜フトスコヌプを持っおいるず蚀っおも意味がありたせんか そしお、モゞュヌルはusing SoftGlobalScope゜フトスコヌプにオプトむンできたすか

私は掚枬したすスコヌプルヌルは埌方互換性がないため、スクリプトで倉曎できたせん。぀たり、1.0甚に蚘述されたコヌドが1. *バヌゞョンで実行されるずいう玄束を砎るこずになりたす。 REPLのスコヌプに関する同じ問題がスクリプトにも圓おはたるずいうのは正しいですスクリプトずしお実行したずきにコヌドが正しく機胜しない理由を完党に倱ったナむヌブなナヌザヌ。 倧きな非互換性なしにこの問題を解決/軜枛する方法は、゜フトスコヌプたたは代替を䜿甚するオプションjulia -fプログラムファむルなどをjuliaコマンドラむンに远加し、初心者が行う可胜性のある説明/チュヌトリアルでこのオプションを衚瀺するこずです。出くわす。
たた、いく぀かの利点がある可胜性のある゜フトスコヌプの朜圚的な代替案もありたすおそらく欠点を芋萜ずしおいたすがファむルスクリプトず呌ばれるが垞に独自のロヌカルスコヌプを導入する堎合スコヌプルヌルは、機胜し、倚くのナヌザヌの期埅に応えたす。 たた、新しいナヌザヌのパフォヌマンス䞊の問題の倚くが解消されたす。
䞍芁なグロヌバルグロヌバルを明瀺的に定矩する必芁がありたすがなくなり、コヌドがコンパむルされる可胜性がありたす
すべおを関数に入れ、グロヌバルの䜿甚を避けるために、䜕回蚀わなければなりたせんでしたか

私はこれにぶ぀かったばかりで、正盎に蚀うず完党に困惑しおいお、他の蚀語でこれたで芋たこずがありたせんでした。 物事が萜ち着いたら、今幎埌半に倧孊の䞊玚Rナヌザヌ向けにオプションのJuliaコヌスを導入する予定です。生埒は、REPLでランダムに入力を開始する0日目にこれをヒットしたす。 たた、 forルヌプがifステヌトメントずは異なる動䜜をするずいう事実は、傷口に塩をこすり぀けるだけですが、これはスコヌプの芳点からは論理的かもしれたせん。 関数内のスコヌプは、生物孊の孊生が理解するのに十分に困難です。REPL/スクリプト/ forルヌプ/ ifステヌトメントで_認識されおいるにもかかわらず_明癜な矛盟を説明する必芁があるずいう考えそれが私たちが話しおいるこずだからですここに぀いお地球䞊の他のすべおの蚀語ずは異なる方法で、私は非垞に悲しくなりたす。

䞋䜍互換性の玄束がなされたこずは理解しおいたすが、この䜜業を_地球䞊のすべおの非csの人および私が疑うほずんどのcsの人が期埅するように_行うこずは、䞋䜍互換性の問題ずいうよりはバグ修正のようです-私たちは蚀っおいたせんすべおのバグが氞遠に再珟されるずいうこずですか REPLの修正は明らかに䞍可欠なので、これを提案するのは玠晎らしいこずですが、スクリプトをREPLにコピヌできず、同じ動䜜が元の問題ず同じかそれより悪いように芋えるこずを説明する必芁がありたす。

これをバグ修正ずしお扱い、スクリプトずREPLを䜿甚しおプッシュするこずを怜蚎しおください「叀い」動䜜に切り替えるスむッチがある堎合でも。1.0.1でできるだけ早く実行しおください。

私がゞュリアを孊がうずしおいた同僚も、これに出くわしたした。 最初のステップでグロヌバル倉数ずロヌカル倉数の党䜓を説明しなければならないのは理想的ではありたせん...

これを「バグ修正」ずしお扱うこずは、1.0の安定性契玄を砎るこずになるので、カヌドにはないず思いたす。 ただし、 julia -i実行されるスクリプト぀たり「察話型」モヌドにsoftscopeを䜿甚するこずは私には合理的ず思われたす。

぀たり、フラグ--softscope={yes|no}あり、デフォルトでisinteractiveの倀になりたす。

スクリプトモヌドの遞択を怜蚎する必芁がありたす。

さらに蚀えば、「スクリプト」、぀たりjulia foo.jlに察しおデフォルトで--softscope=yesを蚭定し、モゞュヌルずincludeに察しおのみ「ハヌド」スコヌプルヌルをオンにするのは私にずっおはおかしなこずではありたせん。

さらに蚀えば、「スクリプト」に察しおデフォルトで--softscope = yesを䜿甚するのは、私にずっおはおかしなこずではありたせん。

それか。 真剣に怜蚎すべきもう1぀はJunoです。 人々はコヌドを介しおむンタラクティブな開発を行うために<shift-enter>を実行し特に回垰テストを䜿甚する堎合、埌で同じファむルを実行できるこずを期埅するこずを忘れないでください。 コヌドが@testsetかどうかは重芁ですかスコヌプが導入される可胜性があるず思いたす @testset堎合ずAtomの統合を䜿甚しない堎合で同じテキストが倉曎され、 ] test実行ず矛盟する堎合、ナヌザヌは非垞に混乱したす。

最善の解決策は、ハヌドスコヌプが単にオプトむンのものであり、他のすべおの䜿甚法スクリプト内のincludeを含むが特に明蚘しない限りsoftscope䜿甚するこずであるように私には確かに聞こえたす。

地球䞊の他のすべおの蚀語ずは異なりたす

すべおの倉数を導入するためにvar x = 0を蚘述したすか それはたたこれを「修正」し、他の蚀語のようになりたす。

すべおのバグが氞遠に再珟されるず蚀っおいるわけではありたせん。

それはこれがどのように機胜するかではありたせん。 珟圚の動䜜をバグず呌ぶだけでは、必芁な蚀語に倉曎を加えるこずはできたせん。

このためのコマンドラむンオプションがあるべきではないず私は心から思っおいたす。 次に、ゞュリアコヌドのすべおの郚分に、䜿甚するオプションを瀺すコメントたたは䜕かを添付する必芁がありたす。 ゜ヌスファむル内のある皮のパヌサヌディレクティブは少し優れおいたすが、それでも固定ルヌルを持぀こずはさらに優れおいたす。 たずえば、モゞュヌル内のハヌドスコヌプのみが意味をなす堎合がありたす。

教宀で人々が芋おいる躁病、ヒステリヌ、および倧虐殺を回避するのに圹立぀かもしれないこれの説明をもう䞀床提䟛しようず思いたす

「」
Juliaには、ロヌカル倉数ずグロヌバル倉数の2皮類の倉数がありたす。 REPLたたはトップレベルで導入する倉数は、他のもの以倖ではグロヌバルです。 関数ずルヌプ内に導入された倉数はロヌカルです。 プログラム内のグロヌバル倉数の曎新は䞀般的に悪いので、ルヌプたたは関数内にいおグロヌバルを曎新したい堎合は、 global宣蚀を再床蚘述しお、それに぀いお明瀺的にする必芁がありたす。
「」

おそらくそれは改善できるでしょう。 提案を歓迎したす。 私は知っおいたす、あなたはむしろどんな皮類の説明も党く必芁ずしないでしょう。 わかりたした。 しかし、それは私にはそれほど悪くはないようです。

このためのコマンドラむンオプションがあるべきではないず私は心から思っおいたす。 次に、ゞュリアコヌドのすべおの郚分に、䜿甚するオプションを瀺すコメントたたは䜕かを添付する必芁がありたす。 ゜ヌスファむル内のある皮のパヌサヌディレクティブは少し優れおいたすが、それでも固定ルヌルを持぀こずはさらに優れおいたす

同意したす。 私には教育ずコミュニケヌションの頭痛の皮のように聞こえたす。

たずえば、モゞュヌル内のハヌドスコヌプのみが意味をなす堎合がありたす。

私が理解しおいるのは、IJuliaノヌトブックからコピヌした.jlファむルに短いスクリプトモゞュヌルではないがある堎合、そのコヌドをREPLで盎接実行するかshift- Junoに入るず、䞀貫しお゜フトスコヌプずしお動䜜したす...しかし、 moduleブロックの代わりにコピヌするず、グロヌバルに぀いお怒鳎りたすか しかし、そのコヌドをモゞュヌル内の関数内にコピヌするず、機胜するはずです。

もしそうなら、それは完党に理にかなっおいたす、非垞に教えやすく、銖尟䞀貫しおいたす。 トップレベルのスクリプトは、探玢などのためのむンタラクティブなむンタヌフェむスですが、そのようなコヌドをモゞュヌルに配眮するこずは決しおありたせん。 モゞュヌルは、関数で埋める必芁があるものであり、非垞に慎重にグロヌバルず芋なされたす。 それらのルヌルに぀いお人々に䌝えるのは簡単でしょう。

すべおの倉数を導入するためにvarx = 0を蚘述したすか それはたたこれを「修正」し、他の蚀語のようになりたす。

いいえ、私はむしろしたくないです しかし、REPLを持぀スクリプト蚀語ruby、python、Rなどがそれを行うこずはめったになく、Juliav0.6ず同じように動䜜したす。

Juliaには、ロヌカル倉数ずグロヌバル倉数の2皮類の倉数がありたす。 REPLたたはトップレベルで導入する倉数は、他のもの以倖ではグロヌバルです。 関数ずルヌプ内に導入された倉数はロヌカルです。 プログラム内のグロヌバル倉数の曎新は䞀般的に悪いので、ルヌプたたは関数の内郚にいお、グロヌバルを曎新したい堎合は、グロヌバル宣蚀を再床蚘述しお、それに぀いお明瀺的にする必芁がありたす。

私はあなたがここで蚀っおいるこずを完党に理解しおいたす、そしお私は朚に觊れるこの間違いを二床ず犯したせん。 しかし、私が心配しおいる問題党䜓は私ではありたせん。 関数内の倉数は倖郚の倉数を芋るこずができず、その逆も同様であるず説明するず、スコヌプを盎接蚀及せずに導入するのは比范的簡単であるこずがわかりたしたRの事実よりも願望ですが。それ自䜓はすでに_比范的_高床な抂念です。 しかし、これは、スコヌプが人々に圱響を䞎えるほど耇雑なものをリモヌトで望たない、ここでの孊習曲線のはるかに早い段階で発生したす...

たた、「REPLたたはトップレベルで導入する倉数は、他のもの以倖ではグロヌバルである」および「関数およびルヌプ内で導入される倉数はロヌカルである」だけでなく、REPLたたはでのifステヌトメントの倉数でもあるこずに泚意しおください。トップレベルはグロヌバルですが、 @testset倉数はロヌカルです。 「ロヌカルでもグロヌバルでも、頑匵っおみお、自分で詊しおみおください」ずいううさぎの穎に行き着きたす。

ただし、 @ jlperlaに同意したす。「モゞュヌル内のハヌドスコヌプのみが意味をなす可胜性がある」ずいう提案は、私にはたったく問題ないようです。 モゞュヌルも十分に高床な抂念です...゜フトスコヌプがREPLずスクリプトで機胜する堎合、それはたったく問題ありたせん。

スコヌプほど耇雑なものが人々に圱響を䞎えるこずは望んでいたせん...
トップレベルはグロヌバルですが、 @testset倉数はロヌカルです

私が埗ようずしおいるのは、グロヌバルずロヌカルの簡単な説明で初期段階の教育に十分だず感じおいるずいうこずです。「スコヌプ」ずいう蚀葉を蚀う必芁すらありたせんたったく発生したせん。䞊蚘の私の説明で。 REPLでいく぀かの単玔な匏ずルヌプを衚瀺しおいるだけの堎合、テストセットに぀いお人々に教えおいるわけではなく、蚀語内のすべおのスコヌプ動䜜の完党なリストは必芁ありたせん。

私の唯䞀のポむントは、この倉曎により、蚀語に぀いお倚くの詳现を前もっお教える必芁が突然なくなるわけではないずいうこずです。 スコヌプやテストセットなどに関する倧郚分は無芖できたすが、グロヌバルずロヌカルの単玔な線で十分です。

そしお、グロヌバルずロヌカルの単玔な線で十分です。

誰もがすべおのコヌドを最初から曞き始めた䞖界では、私は完党に同意したす。

問題は、範囲だけでなく、取埗したコヌドをコピヌしお貌り付けた堎所の範囲を理解するこずに぀いおも生埒に教える必芁があるずいうこずです。 関数たたはletブロック内のstackexchangeにあるコヌドをコピヌしお貌り付ける堎合は、それをスキャンしお、REPLたたは.jl貌り付ける堎合に「グロヌバル」を远加する堎所を芋぀ける必芁があるこずを教える必芁がありたす。

そしお、孊生はなぜforこのスコヌプを䜜成するのかず尋ね始めたすが、他のこずは心配する必芁はありたせん。

「ロヌカルでもグロヌバルでも、頑匵っおみお、自分で詊しおみおください」ずいううさぎの穎に行き着きたす。

ポップクむズゞュリア0.6では、 xグロヌバルたたはロヌカルです

for i = 1:10
    x = i
end

答えは、グロヌバルxが以前に定矩されおいるかどうかに䟝存するため、知る方法がないずいうこずです。 今、あなたはそれがロヌカルであるず確かに蚀うこずができたす。

皆さん、この議論はもはや生産的ではないこずに焊点を圓おおいたす。 ゞェフは、REPLでの叀い動䜜が良かったこずをよく知っおいたす。 そもそも誰がそれを蚭蚈し、実装したず思いたすか 私たちはすでにむンタラクティブな振る舞いを倉えるこずを玄束したした。 「スクリプト」がむンタラクティブであるかどうかに぀いおは、ただ決定を䞋す必芁がありたす。 「スクリプト」ず呌ぶずむンタラクティブに聞こえたすが、「プログラム」ず呌ぶずむンタラクティブに聞こえたせんが、たったく同じです。 返信は短く建蚭的なものにし、ただ決定しなければならないこずに焊点を圓おおください。 これから逞脱したコメントがあるず、コメントが非衚瀺になり、スレッドがロックされる可胜性がありたす。

私が持っおいたず思ったのですが、「煩わしすぎお」「村人に熊手を出させそう」ず华䞋したのは、非察話型のコンテキストでは、 localたたはglobalが必芁になる可胜性があるずいうこずglobalアノテヌション。 これにより、モゞュヌルからのコヌドがREPLに貌り付けられた堎合に同じように機胜するこずが保蚌されたす。 それを「スクリプト」/「プログラム」に適甚した堎合、同じこずがそれらにも圓おはたりたす。

私が最初にJuliaを玹介されたずき少し前で、Fortranのバックグラりンドを持っおいるこずがほずんどです、「Juliaは関数レベルでコンパむルされお高速であるため、効率的でなければならないこずはすべお関数内で実行する必芁がありたす。 。メむンの「プログラム」では、スクリプト蚀語のように動䜜したす。 そのステヌトメントを理解せずに蚈算量が倚すぎるこずをしおいる人を想像するこずはできないので、私はそれが十分に公平であるこずに気づきたした。 したがっお、関数ず同じ衚蚘法ず構造を䜿甚するためにメむンプログラムでパフォヌマンスが犠牲になった堎合、これらのスコヌプ芏則を理解しお教えようずしおコピヌできず、ある堎所から別の堎所にコヌドを貌り付けたす。

ちなみに、私はただゞュリアの初心者ですが、高校生ず倧孊生に物理システムのシミュレヌションの基本を教えるためにそれを遞択したした。 そしお、私はすでにこの問題が以前のバヌゞョンの「通垞の」動䜜に戻るこずを望んでいたす。それは私たちにかなりの頭痛の皮を䞎えるからです。

この䌚話は珟圚ロックされおおり、Juliaコミッタヌのみがコメントできたす。

@JeffBezanson 、最初はREPLでのみ、他の堎所でオプトむンしお、この談話スレッドで提案したセマンティクスを実装する蚈画は䜕でしょうか

SoftScope.jlを構文曞き換えするのではなく、それを盎接䞋降コヌド julia-syntax.scm に入れるこずを蚈画しおいるようです。 たたは、最初に構文を曞き換えおSoftScopeを提案されたルヌルに倉曎し、stdlibに倉換しお、埌のJuliaリリヌスの䞋䜍コヌドに入れるのを延期したすか

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡