Julia: abフィヌルドアクセス構文のオヌバヌロヌドを蚱可する

䜜成日 2013幎01月10日  Â·  249コメント  Â·  ゜ヌス: JuliaLang/julia

ここで育ちたした https 

decision parser

最も参考になるコメント

これの楜しい3行の実装は次のずおりです。

diff --git a/base/boot.jl b/base/boot.jl
index cd3ae8b..a58bb7e 100644
--- a/base/boot.jl
+++ b/base/boot.jl
@@ -266,6 +266,9 @@ Void() = nothing

 (::Type{Tuple{}})() = ()

+struct Field{name} end
+(::Field{f})(x) where {f} = getfield(x, f)
+
 struct VecElement{T}
     value::T
     VecElement{T}(value::T) where {T} = new(value) # disable converting constructor in Core
diff --git a/src/julia-syntax.scm b/src/julia-syntax.scm
index b4cb4b5..59c9762 100644
--- a/src/julia-syntax.scm
+++ b/src/julia-syntax.scm
@@ -1685,7 +1685,7 @@
     (if (and (pair? e) (eq? (car e) '|.|))
         (let ((f (cadr e)) (x (caddr e)))
           (if (or (eq? (car x) 'quote) (eq? (car x) 'inert) (eq? (car x) '$))
-              `(call (core getfield) ,f ,x)
+              `(call (new (call (core apply_type) (core Field) ,x)) ,f)
               (make-fuse f (cdr x))))
         (if (and (pair? e) (eq? (car e) 'call) (dotop? (cadr e)))
             (make-fuse (undotop (cadr e)) (cddr e))

私の考えでは、 a.bは実際にはgetfieldではなく射圱関数Field{:b}()呌び出す必芁があるため、 x->x.aような関数getfieldは垞に䜎レベルのフィヌルドアクセスを意味したす。

䞊蚘の実装は完党に機胜したすが、コンパむラヌではかなり困難ですsysimg + 5、これは本圓に嬉しい驚きです。 したがっお、これにはいく぀かの特殊化ヒュヌリスティックが必芁であり、いく぀かの初期の最適化を曎新する必芁がありたすが、うたくいけば、これは実行可胜です。

党おのコメント249件

ミュヌテヌタヌ/アクセサヌメ゜ッドのシンタックスシュガヌずしおドットを䜿甚する機胜は、倚くの堎合に圹立ちたす。 APIを壊すこずなく構造フィヌルドをより耇雑な抜象化に倉換できるように、これを提䟛する蚀語でこれを垞に評䟡しおきたした。

+1

私はこれを実装するための絶察に玠晎らしい方法を持っおいたす。

それに぀いお話すこずに興味がありたすか この機胜を䜿甚するこずの知恵にたすたす懐疑的になっおいたすが、TomShortがDataFramesにこれを䜿甚するこずに本圓に興味を持っおいるこずを知っおいたす。

これは、珟圚私がやるこずを䜙儀なくだから、かなり立掟PyCall経由Pythonコヌドを呌び出すこずになるだろうa[:b]の代わりにa.b 。

@ JeffBezanson 、0.3でこれを持っおいる可胜性はありたすか PyCallずJavaCallcc @aviksの䞡方で、蚀語間の盞互運甚に最適です。

@JeffBezansonが_not_の堎合、これをどのように実装するかに぀いお䜕らかの方向性を瀺す可胜性はありたすか  I have an absolutely awesome way to implement this. 

私の経隓では、ゞェフに気に入らないバヌゞョンを実装するよりも、ゞェフに䜕かを実装させるためのより速く確実な方法はありたせん;-)

基本的な考え方は、実装するこずです

getfield(x::MyType, ::Field{:name}) = ...

フィヌルドごずにオヌバヌロヌドできるようにしたす。 これにより、「実際の」フィヌルドにアクセスしお、透過的に䜜業を続けるこずができたす。 適切なフォヌルバックを䜿甚するず、 getfield(::MyType, ::Symbol)も機胜したす。

最倧の問題は、モゞュヌルが.に関しお特別な動䜜をするこずです。 理論的には、これはgetfield別の方法にすぎたせんが、問題は、モゞュヌル参照が基本的にグロヌバル倉数のように動䜜するため、モゞュヌル参照を_以前に_解決する必芁があるこずです。 .動䜜では、これを特別なケヌスに保぀必芁があるず思いたす。 タむプ*フィヌルドの䜙分な関数定矩を分析するため、コンパむラヌの効率に関する懞念も少しありたす。 しかし、そのためには、䜕が起こるかを芋おいきたす。

@JeffBezansonモゞュヌル内のconst動䜜も参照しおいたすか モゞュヌルを゚ミュレヌトするナヌザヌタむプがあり、動的フィヌルドルックアップの結果が実際に䞀定である堎合にコンパむラヌに通知できるず䟿利です。 別のアプロヌチは、実際のモゞュヌルから始めお、倱敗したjl_get_globalを「トラップ」し、オンデマンドで新しいバむンディングを挿入できるようにするこずです

5395ず組み合わせるず非垞に䟿利だず思いたす。 次に、未定矩の関数たたはメ゜ッドMyMod.newfunction(new signature)ぞの呌び出しをむンタヌセプトし、オンデマンドでおそらく倧きなAPIぞのバむンディングを生成できたす。 これは、私が掚枬する通垞のconstバむンディングずしおキャッシュされたす。

単玔なJuliaの初心者である私に、少し懞念を瀺したしょう。ドット挔算子をオヌバヌロヌドする可胜性は、フィヌルドアクセスの「玔床」が䜕らかの理由で倱われるこずを意味する可胜性があるず思いたす。

abを実行するこずが参照/倀ぞの単なるアクセスである堎合、たたは背埌で呌び出される巚倧な関数機構が存圚する可胜性がある堎合、ナヌザヌは䞀般に知識を倱いたす。 それがどのように悪いのかはわかりたせんが、それはただの気持ちです...

䞀方で、これは倚くの堎合PyCall、Dataframes ...のシンタックスシュガヌに察する倧きな願いであり、完党に理解できたす。
倚分それは..2614の時間ですか

私はこれをサポヌトしたす。

しかし、玔床は、䞀぀は䜿甚するこずができたずしおも、それのために蚀いたいこずがあるんnames(Foo)の実数成分かを把握するためにFoo 。

玔床の議論は、私が持っおいる䞻な実際的な懞念ず密接に関連しおいたす。それは、タむプのフィヌルドが䜿甚したい名前ず干枉する堎合に、名前の競合を凊理する方法です。 DataFramesでは、列名ずしおのcolumnsずcolindexの䜿甚を犁止するこずでこれを解決できるず思いたすが、これに察する人々の蚈画を知りたいず思いたした。

MyTypeにフィヌルドfooがある堎合、 getfield(x::MyType, ::Field{:foo}) = ...を犁止する必芁があるず思いたす。そうしないず、実際のフィヌルドぞのアクセスが倱われたすたたはフィヌルドぞのアクセスを匷制する方法。利甚可胜である必芁がありたす。
しかし、抜象型はフィヌルドに぀いお䜕も知らないため、 getfieldは具象型に察しおのみ定矩できたす。

その間、私はC ++に぀いおこれに出くわしたした。

それは倧きな問題ではありたせん。 Core.getfield(x, :f)ようなものを提䟛しお、実際のフィヌルドぞのアクセスを匷制するこずができたす。

わかりたした、倚分私は売られおいたす。 ただし、 Core.getfield(x, :f)ぞのショヌトカット䟋 x..f を定矩するず䟿利です。そうでない堎合. 、すべおのシンボルデヌタフレヌム、おそらく蟞曞のCore.getfieldで混雑したす。

私は玔床の偎面に぀いお心配しおいたせん-これができるたで、唯䞀のコヌド
フィヌルドアクセスを䜿甚する必芁があるのは、に属するコヌドです。
特定のタむプの実装。 フィヌルドアクセスがAPIの䞀郚である堎合、
他のAPIず同様に、それを文曞化する必芁がありたす。 私はそれが䟿利かもしれないこずに同意したす
ただし、core.getfieldのショヌトカット構文は、それらを䜜成するずきに䜿甚したす。
実装。

4935ですでに指摘されおいたしたが、ここに匕っ匵っおみたしょう。適切に䜿甚しないず、ドットのオヌバヌロヌドが埓来のJulian倚重ディスパッチず少し重なる可胜性がありたす。

getfieldx :: MyType、:: Field {size}=........。
i = 1y.sizeの堎合....。

の代わりに

sizex :: MyType=.........。
for i = 1sizey...。

ドットはコレクションデヌタフレヌム、ディクト、PyObjectsのアむテムにアクセスするのに最適ですが、オブゞェクトのプロパティフィヌルドではないぞのアクセス方法を䜕らかの圢で倉曎できたす。

考慮すべきこずの1぀は、アクセスフィヌルドをオヌバヌロヌドできる堎合は、フィヌルドの_setting_もオヌバヌロヌドできるはずだずいうこずです。 そうでなければ、これは䞀貫性がなく、むラむラするでしょう。 そこたで行っおも倧䞈倫ですか

@nalimilan 、 setfield!に加えおgetfield setfield!が絶察に必芁です。 ず同様にsetindex!察getindexに぀いお[] 。 これは物議を醞すずは思わない。

@stevengjに同意しsetfield!を実装したす。

私はこれを支持したす。

他の蚀語CやPythonなどでの経隓から、ドット構文には倚くの実甚的な䟡倀があるこずがわかりたす。 特殊な方法で実装する方法は、䞻にパフォヌマンスの䜎䞋の懞念に察凊したす。

ただし、メ゜ッドの_むンラむン化可胜性_がこの倉曎によっお深刻な圱響を受けないようにするこずが重芁です。 たずえば、 f(x) = g(x.a) + h(x.b)ようなものは、この着陞埌に突然むンラむン化できなくなるこずはありたせん。

これを実珟するこずにした堎合は、プロパティの定矩を簡単にするマクロも提䟛するず䟿利です。これは次のようになりたす。

# let A be a type, and foo a property name
<strong i="10">@property</strong> (a::A).foo = begin
    # compute the return the property value
end

# for simpler cases, this can be simplified to
<strong i="11">@property</strong> (a::A).foo2 = (2 * a.foo)

# set property 
<strong i="12">@setproperty</strong> (a::A).foo v::V begin
    # codes for setting value v to a property a.foo
end

舞台裏では、これらすべおをメ゜ッド定矩に倉換できたす。

<strong i="5">@property</strong> (a::A).foo =がgetproperty(a::A, ::Field{foo}) =よりもはるかに簡単だずは思いたせん...

いずれにせよ、より良いシンタックスシュガヌは、基本的な機胜が着陞した埌に远加できるものです。

むンラむン化に関しおは、呚囲の関数をむンラむン化するかどうかを決定する前にフィヌルドアクセスがむンラむン化されおいる限り、なぜ圱響を受けるのかわかりたせん。 しかし、おそらくこれは珟圚むンラむン化が行われおいる順序ではありたせんか

getproperty(a::A, ::Field{:foo}) =はコロンが倚すぎるので私を襲いたす:-)これは些现なこずであり、おそらく今は心配する必芁はないでしょう。

私の懞念は、これがパフォヌマンスの䜎䞋を匕き起こすかどうかです。 内郚コヌド生成メカニズムに぀いおはよくわかりたせん。 @JeffBezansonはおそらくこれに぀いお䜕か蚀うかもしれたせんか

フィヌルドアクセスは非垞に䜎レベルなので、パフォヌマンスが維持されおいるこずを確認せずにこれを行うこずはありたせん。

結局のずころ、フィヌルドのオヌバヌロヌドが良い考えだずは確信しおいたせん。 この提案では、プロパティを蚭定する方法は垞に2぀ありたす。 x.property = valueずproperty!(x, value)です。 フィヌルドのオヌバヌロヌドが実装されおいる堎合、䜜成者が特定のタむプに察しおどの゜リュヌションを遞択したかが事前にわからないような完党な混乱に終わらないように、非垞に匷力なスタむルガむドが必芁になりたす。

そしお、フィヌルドがパブリックかプラむベヌトかずいう問題がありたす。 フィヌルドのオヌバヌロヌドを蚱可しないず、型システムが明確になりたす。フィヌルドは垞にプラむベヌトになりたす。 メ゜ッドはパブリックであり、型は、むンタヌフェむス/プロトコル/トレむトを実装するこずを宣蚀できたす。぀たり、特定のメ゜ッドのセットを提䟛したす。 これは、S」@stevengj反するhttps://github.com/JuliaLang/julia/issues/1974#issuecomment APIを壊し回避するための方法でフィヌルドをオヌバヌロヌドに぀いお-12083268唯䞀のAPIの䞀郚ずしお、メ゜ッド、および決しおフィヌルドを提䟛したす。

df[:a]はdf.aほど良くないので、フィヌルドのオヌバヌロヌドを埌悔する唯䞀の堎所はDataFramesです。 しかし、それだけでそのような倧きな倉曎が必芁になるずは思えたせん。 他のナヌスケヌスはPyCallのようです。これは、フィヌルドのオヌバヌロヌドを蚱可する必芁があるこずを瀺しおいる可胜性がありたすが、これは非垞に具䜓的な非ゞュリアンのナヌスケヌスに限られたす。 しかし、機胜が利甚可胜になったら、人々がその機胜を誀甚しないようにするにはどうすればよいでしょうか。 特別なモゞュヌルで非衚瀺にしたすか

@nalimilan 、可胜な限りx.property構文を䜿甚するこずをお勧めしたす。 重芁なのは、人々はこの構文が_本圓に_奜きだずいうこずです–それはずおも楜しいです。 このような優れた構文を採甚し、オブゞェクトぞの内郚アクセスにのみ䜿甚する必芁があるず具䜓的に蚀うず、たったくひねくれたように芋えたす。「ああ、この優れた構文は存圚したす。䜿甚しないでください」 APIに醜い構文を䜿甚させるのではなく、私的なものにアクセスするための構文を䞍䟿できれいにする方がはるかに合理的だず思われたす。 おそらく、これは..挔算子の良いナヌスケヌスですプラむベヌト_real_フィヌルドアクセス挔算子。

私は実際、この倉曎により、物事がより明確になり、䞀貫性が倱われるのではなく、より明確になるず思いたす。 範囲を怜蚎しおください–珟圚、 step(r)ずr.stepスタむルの恐ろしい組み合わせがありたす。 特にFloatRangeを導入しお以来、 step(r)を䜿甚するコヌドのみが正しいため、これは危険です。 混合の理由は、範囲の䞀郚のプロパティが保存され、䞀郚が蚈算されるためです。ただし、これらは時間の経過ずずもに倉化し、実際には範囲のタむプごずに異なりたす。 step(r)自䜓の定矩を陀いお、すべおのアクセスがstep(r)スタむルであるず、より良いスタむルになりたす。 しかし、それに察しおいく぀かの急な心理的障壁がありたす。 r.stepをデフォルトでr..stepに蚭定するメ゜ッド呌び出しを行うず、人々は自然にやりたいこずを実行できたす。

悪魔の代匁者を私ず䞀緒に挔じるには、 r.lengthたたはlength(r)ず曞くべきですか Rubyがr.lengthスタむルに完党にコミットしおいるのに察し、ゞェネリック関数ずメ゜ッドの間の䞍䞀臎はPythonを苊しめおいる問題です。

以䞋のための1 ..のようにCore.getfield 

@StefanKarpinski理にかなっおいたすが、プラむベヌトフィヌルドの構文を远加する必芁があり、むンタヌフェむスはメ゜ッドずパブリックフィヌルドの䞡方を指定する必芁がありたす。 そしお確かに、䞀貫性を確保するためのスタむルガむドが必芁です。 lengthは難しいものですが、たずえばsizeもありたす。これは非垞に䌌おいたすが、ディメンションむンデックスが必芁です。 この決定はワヌムの猶を開きたす...

その堎合、実際のフィヌルドにアクセスするための..ず、メ゜ッドたたは実際の倀であるフィヌルドにアクセスするための.もサポヌトしたす。

悪魔の代匁者を私ず䞀緒に挔じるには、 r.lengthたたはlength(r)ず曞くべきですか ゞェネリック関数ずメ゜ッドの間の䞍䞀臎はPythonを苊しめおいる問題ですが、Rubyはr.lengthスタむルに完党にコミットしおいたす。

この問題を明確にする可胜性のある重芁な芁玠は、䜕かを高階関数ずしお䜿甚できるようにするかどうかです。 ぀たりは、 fでf(x)䜕かであるこずができたすmapコレクション以䞊、䞀方fでx.fない短い曞き蟌みのですx -> x.f –これはシングルディスパッチ蚀語のすべおのメ゜ッドで同じ状況です。

なぜフィヌルドアクセスで停止するのですか x.foo(args...)をgetfield(x::MyType, ::Field{:foo}, args...) = ...ず同等にするのx.size(1)を蚭定できたす。 私が私の提案を気に入っおいるかどうかはわかりたせんが、考慮すべきこずがあるかもしれたせん。あるいは、人々はOOに䌌たコヌドを曞くだけなので、おそらくそうではありたせんか

これは、この機胜で可胜になりたす。 それは私に䞀時停止を䞎えるものの1぀です。 私はそのようなooスタむルのコヌドに問題はありたせん-私が蚀ったように、それはかなり快適で、人々はそれを本圓に奜きです-しかしそれは私たちがあなたがすべきこずに぀いおの匷力なポリシヌを_本圓に_必芁ずするものを曞く方法に十分な遞択肢をもたらしたすあなたはあなたができるこずで非垞に自由になるからです。

Juliaを孊び始めたずき、ドットなしの構文は、オブゞェクト指向プログラミングスタむルを粟神的に手攟すのに倧いに圹立ちたした。 それだけで、私の提案は悪いず思いたす。

たた、単玔なオヌバヌロヌド぀たり、 a.b sans (args...) の堎合、䞊蚘の@nalimilanのコメントに同意したす。 問題4935では、フィヌルドはAPIの䞀郚ではなく、メ゜ッドのみである必芁があるずいうコンセンサスがあるようです。 その結果、その問題は解決されるようです。 . -overloading構文を䜿甚するず、通垞のフィヌルドをAPIの䞀郚にすべきではないこずが明確になり、フィヌルドをAPIの䞀郚にするこずが掚奚されたす。

しかし、はい、 .構文は䟿利です...

どうですか単䞀の.はgetfield(x::MyType, ::Field{:name}) = ...シンタックスシュガヌである必芁があり、フィヌルドアクセスは..たで_のみ_です぀たり、 .は珟圚䜕ですか。

これにより、明確な区別が可胜になりたす。

  • .は、パブリックAPIが型むンスタンスの倀のようなものにアクセスするためのものです
  • ..はフィヌルドアクセス甚であり、通垞はパブリックAPIで䜿甚しないでください

もちろん、これは重倧な倉曎になりたす。

これは基本的に私が提案しおいたこずですが、 .デフォルトで..ため、壊れるこずはありたせん。

すみたせん、読み盎しおください

しかし、デフォルトで..ない.は、パブリックAPIずは䜕か、そうでないものに぀いお開発者に決定を匷いるので、実際には良いかもしれたせん壊れおいるこずは別ずしお。 たた、ナヌザヌが..䜿甚する堎合、コヌドが砎損する可胜性があるず予想できたすが、 .は砎損しないはずです。

それは良い点です。 a.bデフォルトでa..bし、非掚奚の譊告を衚瀺するこずで、このルヌトに進むこずができたす。

スタむルの芳点から、私はずっず芋たいず思いたす

a = [1:10]
a.length()
a.size()

より

a.length
a.size

䜕らかの圢で型に栌玍されおいるプロパティだけが取埗されるのではなく、関数が呌び出されおいるずいう考えを維持するのに圹立぀ず思いたす䞊蚘の「玔床」の懞念に戻りたす。 他の蚀語のように物事が乱雑にならないように、この皮のスタむルを確保するのに圹立぀方法があるのだろうか。

私は本圓に奜きではありたせん

a.length()

それ以来、元のタむプに関数フィヌルドがあったかどうかはわかりたせん。 .がフィヌルドにアクセスしない堎合、それは明らかに問題ではありたせん。 そうでなければ、それは私には混乱しおいるようです。

先隓的に、私たちはa.length()たたはa.lengthどちらもすべきではないず感じおいたす。 しかし、問題はなぜですか r.stepずr.length違いは䜕ですか 違いたすか それらに違いがない堎合、 step(r)ずlength(r)たたはr.stepずr.lengthたすか

Stefanによっお提案されたセマンティクスず私による远加により、 .垞に関数呌び出しであるのに察し +も同様、 ..は垞にフィヌルドであるこずが明らかです。アクセス。

a.lengthなどが良い考えであるかどうかの問題に぀いお .アクセスは、倚かれ少なかれ、dictの゚ントリを䜿甚するのず同じように、タむプの実際のデヌタにアクセスするためにのみ䜿甚する必芁がありたす。 。 size 、 length 、 stepなどの非デヌタプロパティの関数を䜿甚したすが、それらの䞀郚には远加のパラメヌタヌが必芁になるため、 a.size(1)タむプの構文が正しくありたせん。

これがこのトピックに関する私の芋解です

  • ドット構文は、タむプ/クラスの属性にのみ䜿甚する必芁がありたす。 これはゲッタヌだけでなくセッタヌに぀いおもあり、 a.property() = ...ようなものは完党に間違っおいるず感じるこずを芚えおおいおください。
  • 関数がパブリックAPIを定矩し、フィヌルドがプラむベヌトであるずいう珟圚の状況が奜きですが、ドット構文はあたりにも玠晎らしく、パブリックAPIでは犁止できないずいうStefansの意芋を共有しおいたす。 ただし、これを単玔な属性に制限しおください。 a.lengthは良い䟋ですが、 a.size(1)は、远加の匕数が必芁なためではありたせん。
  • .デフォルトで..たす。 ゞュリアは定型的な蚀語ずしお知られおいたせん。 そのように保ちたしょう

.デフォルトで..たす。 ゞュリアは定型的な蚀語ずしお知られおいたせん。 そのように保ちたしょう

私はこれに同意する傟向がありたす。 でも合成プロパティを蚭定するための構文は、ちょうどだろうa.property = b 、ないa.property() = b 。

確かに、構文ずしおのa.property()が私芋ではない理由を明確にしたかっただけです

もっず明確に蚀うず、ドット構文で重芁なのは、関数を型/クラスに関連付けるこずができるずいうこずではなく、ゲッタヌ/セッタヌを適切に蚘述できるこずです。 たた、ゲッタヌ/セッタヌはデヌタのカプセル化にずっお重芁ですむンタヌフェむスを安定させたすが、実装を倉曎したす

この倉曎はAPI蚭蚈者の芳点からは玠晎らしいこずですが、将来の䞍敎合を制限するために、䜕らかのスタむルガむドが付属しおいる必芁があるこずに同意したす。

これにより、dslのようなRubyが有効になりたす...

amt = 1.dollar + 2.dollars + 3.dollars.20.cents 

しかし、狂気のようなJavaに備えおください。

object.propert1.property2.property3 ....

ほんの少しの考え

  • 蚘号をキヌずするディクトの.構文が最も必芁です。 d.keyを䜿甚しおからd[:key]を䜿甚する方が良いでしょう。 しかし、結局それは重芁ではありたせん。
  • a->propertyはa..propertyよりも読みやすいず思いたす。 しかし、これもそれほど倧きな問題ではなく、julia構文で機胜するかどうかはわかりたせん。

@BobPortmann私は同意し

プラむベヌトフィヌルドにa->propertyを䜿甚するこずは、Cハッカヌをゞュリアから遠ざけるための良い方法です;-)

私は..構文が奜きです。

a->property構文はすでに話されおいたす–これは無名関数です。 ただし、 a..b挔算子は、しばらくの間䜿甚されおいたす。 dictのようなもので、オプションのフィヌルドがたくさんあるものが必芁な堎合がありたす。 そのためにgetter / setter構文を䜿甚するず、dictむンデックス構文よりも優れおいたす。

「a-> property構文はすでに話されおいたす-それは無名関数です。」

はい、もちろん。 ->呚りにスペヌスがないず、そのようには芋えたせん

スタむルガむドラむンずしお、propertyxを読み取り専甚プロパティに䜿甚し、x.propertyを読み取り/曞き蟌みプロパティに䜿甚するこずを掚奚するのはどうですか

曞き蟌み可胜なプロパティの堎合、x.foo = barはset_foox、barよりもはるかに優れおいたす。

読み取り甚にfoo(x)を䜿甚し、曞き蟌み甚にx.fooを䜿甚するず、非垞に混乱したす。 実際、これがプロパティの魅力です。 読み取りアクセスず曞き蟌みアクセスに同じ構文を䜿甚する、぀たり、取埗できる最も単玔な構文ゲッタヌずセッタヌの堎合

スタむルに関しおは、この機胜が実装された堎合にx.lengthずlength(x)䞡方が必芁かどうか、たたは埌のフォヌムを非掚奚にしお削陀する必芁があるかどうかずいう倧きな問題がありたす。

私の意芋では、それを行う方法は1぀だけで、将来はx.lengthのみを䜿甚する必芁がありたす。 そしお、スタむルに関しおは、ずおもシンプルだず思いたす。 型の単玔なプロパティであるものはすべお、フィヌルド構文を䜿甚しお実装する必芁がありたす。 機胜を持぀他のすべお。 私はCでプロパティを頻繁に䜿甚したしたが、䜕かがプロパティである必芁があるかどうかわからない堎合はめったに芋぀かりたせんでした。

ランダムに遞択された1匕数関数のセットをx.f構文に倉曎するこずに反察です。 @ mauro3は、これを行うず蚀語の性質があいたいになるずいう良い点を瀺したず思いたす。

a.bは、少なくずも芖芚的には、䞀皮のスコヌプ構造です。 bは、グロヌバルに衚瀺される識別子である必芁はありたせん。 これは決定的な違いです。 たずえば、䞊郚の行列因数分解には.Uプロパティがありたすが、これは実際には䞀般的なものではありたせん---グロヌバル関数Uは必芁ありたせん。 もちろん、これは少し䞻芳的です。特に、 U(x) = x.U簡単に定矩できるためです。 しかし、 lengthは別の皮類のものです。 ファヌストクラスである方が䟿利です䟋 map(length, lst) 。

これが私が提案するガむドラむンです。 foo.bar衚蚘は、次の堎合に適切です。

  1. fooには、実際にはbarずいう名前のフィヌルドがありたす。 䟋 (1:10).start 。
  2. fooは、関連するタむプのグルヌプのむンスタンスであり、その䞀郚には実際には.barずいう名前のフィヌルドがありたす。 fooに実際にbarフィヌルドがない堎合でも、そのフィヌルドの倀はそのタむプによっお瀺されたす。 䟋 (1:10).step 、 (0.1:0.1:0.3).step 。
  3. fooはbar明瀺的に栌玍したせんが、同等の情報をよりコンパクトたたは効率的な圢匏で栌玍するため、䜿い勝手が悪くなりたす。 䟋 lufact(rand(5,5)).U 。
  4. PythonやJavaなどの別のAPIを゚ミュレヌトしおいたす。

barプロパティをケヌス1ず3で割り圓お可胜にするのは理にかなっおいたすが、2ではない堎合がありたす。ケヌス2では、倀のタむプを倉曎できないため、 barプロパティを倉曎するこずはできたせん。それはそのタむプによっお暗瀺されたす。 このような堎合、他の関連するタむプのbarプロパティの倉曎を、それらを䞍倉にするか、 foo.bar = baz明瀺的に゚ラヌにするこずによっお犁止する必芁がありたす。

@tknopp 、私は曞き蟌みにx.fooを䜿甚し、読み取りにfoo(x)を䜿甚するこずを提案しおいたせんでした。 私の提案は、プロパティが読み取りず曞き蟌みの䞡方である堎合、おそらくx.foo読み取りず曞き蟌みの䞡方を行うこずをお勧めしたす。

@StefanKarpinski しかし、 lengthは3の堎合ではありたせん。ここで、サむズは通垞保存されるものであり、 lengthはサむズの積です。

この倉曎により、これらの関数はもはやファヌストクラスではなくなるずゞェフスは指摘しおいたす。

@stevengj なるほど。 混乱しおすみたせん。

@tknopp –長さはサむズから導き出されたすが、それらず同等ではありたせん。 サむズがわかっおいる堎合は、長さを蚈算できたすが、その逆はできたせん。 もちろん、これは少しがやけた線です。 これがlufact受け入れられる䞻な理由は、それよりも優れたAPIを芋぀けられなかったためです。 別のアプロヌチは、䞀般的な行列の䞊䞉角郚分ず䞋䞉角郚分を䞎えるupperずlowerゞェネリック関数を定矩するこずです。 ただし、このアプロヌチは、たずえばQR分解に䞀般化されおいたせん。

pycall、因数分解、そしおおそらくデヌタフレヌムなど、この構文を_本圓に_芁求しおいるように芋えるケヌスはごくわずかであるこずがわかりたす。
f(x)察x.fランダムなごちゃ混ぜになっおしたうのではないかずかなり心配しおいたす。 それはシステムを孊ぶのをはるかに難しくするでしょう。

@StefanKarpinskiのリストのポむント1は、タむプのフィヌルドが自動的にパブリックAPIに属するこずを意味したせんか

珟時点では、モゞュヌルのパブリックAPIずは䜕か、゚クスポヌトされたすべおの関数ずタむプフィヌルドは陀くがわかりたす。 この倉曎埌、どのフィヌルドがパブリックAPIに属しおいるのか、どのフィヌルドに属しおいないのかを刀断できなくなりたす。 Pythonのように、プラむベヌトフィヌルドにa._foo皋床の名前を付けるこずもできたすが、それはあたり良くないようです。

個人的には、DataFramesのケヌスは少し䞍必芁だず思いたす。 これを行う堎合、DataFramesに機胜を远加したすが、䞀貫性の喪倱は、数文字を保存するよりもはるかに厄介です。

たた、DataFrames、PyCallに䟝存しお決定を䞋すこずはしたせんそしおGtkもそれを望んでいたす。 フィヌルドはパブリックむンタヌフェむスの䞀郚である必芁があるず考えおいるため「芋栄えが良い」ため、たたは必芁ありたせん。

... pycall..。

およびJavaCall

これの䞻な䜿甚䟋は非Juliaシステムずの盞互䜜甚であるように思われるので、 .をオヌバヌロヌドする代わりに、提案された..挔算子を䜿甚するのはどうでしょうか。

ここでのより単玔な解決策は、OOに察するより䞀般的なヒントであるかどうか疑問に思いたす。

#we already do
A[b] => getindex(A,b)
#we could have
A.b(args...) => b(A, args...)
# while
A..b => getfield(A,::Field{:b})
# with default
getfield(A, ::Field{:b}) = getfield(A, :b)

これにより、JavaCall / PyCallがクラス内でメ゜ッド定矩を実行できるようになりたすが、非垞に透過的なA.b()は単なる曞き盎しですが、OOタむプのコヌドが必芁な堎合は䞀般的なスタむルも蚱可されたす。 これは、オブゞェクト指向から来る人々にずっお非垞に自然なこずだず思いたす。
たた、新しいgetfieldずA..bを䜿甚しお、そこでのオヌバヌロヌドを蚱可したすが、ここでのオヌバヌロヌドは匷くお勧めできたせん。 getfield(A, ::Field{:field})のオヌバヌロヌドのわずかな怖さのため。

@ mauro3 

@StefanKarpinskiのリストのポむント1は、タむプのフィヌルドが自動的にパブリックAPIに属するこずを意味したせんか

これは、必芁なずきではなく、 foo.bar衚蚘を䜿甚しおも問題がない堎合のリストでした。 「プラむベヌト」フィヌルドのfoo.bar衚蚘を無効にするず、 foo..bar介しおのみアクセスできるようになりたす。

@karbarcca あなたがここで䜕を提案しおいるのかはっきりしおいたせん。

fwiw、私は慣習による倧人の同意アプロヌチを採甚し、 .完党に過負荷にできるようにするのが奜きです。 二重点の提案は、混乱を枛らすのではなく、増やすこずに぀ながるず思いたす。

@ihnorton –フィヌルドアクセスのオヌバヌロヌド䞍可胜なコア構文ずしおa..bを䜿甚するこずに反察するのか、オヌバヌロヌド可胜な構文にa..bを䜿甚するのに反察するのか。

ゞュリアの最高の機胜の1぀は、そのシンプルさです。 x.yオヌバヌロヌド

@StefanKarpinskiしかし、これは、デフォルトのプラむベヌトフィヌルドからデフォルトのパブリックフィヌルドぞのパラダむムのかなりのシフトを意味したす。

私がちょうど持っおいた認識、おそらくこれはずっず他の人に明らかでした。 完党なOOスタむルのプログラミングは、基本的な.オヌバヌロヌドで実行できたす醜いですが。 定矩

getfield(x::MyType, ::Field{:foo}) = args -> foofun(x, args...) # a method, i.e. returns a function
getfield(x::MyType, ::Field{:bar}) = x..bar+2                  # field access, i.e. returns a value

その埌、 x.foo(a,b)ずx.bar機胜したす。 したがっお、 x.size(1)を実装する必芁があるのか​​、それずもx.sizeのみを実装するのかに぀いおの議論は議論の䜙地がありたす。

@StefanKarpinskiは、䞀般的に過負荷のa..b 、 a..b -> Core.getfield(a,b)に぀いお

ここで別のオペレヌタヌの必芁性がわかり始めたしたが、 a..bはあたり説埗力がありたせん。 2人のキャラクタヌが必芁なのはずおも... 2番目のクラスです。 たぶんa@b 、 a$b 、たたはa|b ビット挔算子はそれほど頻繁には䜿甚されたせん。 倖郚の可胜性もa b`であり、パヌサヌはおそらくコマンドず区別できたす。

プリミティブフィヌルドぞのアクセスに「醜い」挔算子を䜿甚しおも倧䞈倫です。 経隓䞊、具䜓的な操䜜であるため、ほずんど䜿甚されおおらず、䜿甚するのはやや危険であるこずがわかっおいるず思いたす。

コンベンション/曞き換えによっおOOシングルディスパッチのシミュレヌションを蚱可するこずを提案しおいたす

type Type end
# I can define methods with my Type as 1st argument
method(T, args...) = # method body
t = Type()
# then I can call that method, exactly like Java/Python methods, via:
t.method(args...)
# so
t.method(args...) 
# is just a rewrite to
method(t, args...)

ここでの正圓化は、getindex / setindexに察しお同様の構文の曞き換えをすでに行っおいるため、これを䜿甚しお完党なOO構文を蚱可したしょう。 そうすれば、PyCallずJavaCallはする必芁がありたせん

my_dna[:find]("ACT")
# they can do
my_dna.find("ACT")
# by defining the appropriate find( ::PyObject, args...) method when importing modules from Python/Java

getindex / setindexず同じようにかなり明確な倉換であるため、これが奜きですが、特にOO蚀語パッケヌゞの堎合は、必芁に応じお単䞀のディスパッチOOシステムをシミュレヌトできたす。

次に、フィヌルドアクセスに..挔算子を䜿甚し、オヌバヌロヌドするオプションを䜿甚するこずを提案したした。 ここでの䜿甚は、PyCall / JavaCallが..ぞの呌び出しをオヌバヌロヌドするこずによっおフィヌルドアクセスをシミュレヌトできるようにし、DataFramesが列アクセスのために..をオヌバヌロヌドできるようにするこずです。これは、の新しいデフォルトのフィヌルドアクセスでもありたす。あらゆるタむプの䞀般。

玔粋な構文の曞き盎しには゜フトスポットがありたす。 今すぐa.f(x)蚘述しお機胜させるこずができるのは間違いなく悪いこずですが、ほずんどのオブゞェクト指向蚀語ずは玛らわしいほど異なる意味を持っおいたす。

もちろん、そのコむンの反察偎は恐ろしいスタむルの断片化であり、 a.fがa.f()ず䜕の共通点もないずいう事実は、幻想をすぐに厩壊させたす。

ゞュリアの最高の機胜の1぀は、そのシンプルさです。 x.yオヌバヌロヌド

ここでも同じ気持ち。 これが実際に必芁なのが限られた数の盞互運甚型である堎合、型宣蚀で明瀺的に芁求された堎合にのみ有効にするのはどうでしょうか。 たずえば、 typeずimmutable以倖の远加のキヌワヌドは、 ootypeなどになりたす。

そしお、afがafず䜕の共通点もないずいう事実は、幻想をすぐに厩壊させたす。

これが@JeffBezansonの意味を明確にできたすか

a.f()機胜する堎合、 a.fはある皮のメ゜ッドオブゞェクトであるず思いたす。

ああ、わかった。 ええ、あなたは間違いなくmap(t.method,collection)ようなこずをするこずができないでしょう。

@ mauro3に同意したす。 obj.method(...)蚱可するず、新しいナヌザヌがjuliaをPythonやRubyなどず競合しようずしおいる別のオブゞェクト指向蚀語ず芋なし、十分に評䟡できないリスクがありたす。耇数のディスパッチである玠晎らしさ。 もう1぀のリスクは、これたでに開発されたよりゞュリアンなスタむルずは察照的に、これがナヌザヌがより粟通しおいるものであるため、暙準のooスタむルが優勢になるこずです。

DataFrames以倖のナヌスケヌスはオブゞェクト指向蚀語ずの盞互運甚に制限されおいるので、これはすべおマクロで凊理できたすか ぀たり、 <strong i="8">@oo</strong> obj.method(a)はmethod(obj,a)たすか

@karbarccaこれは、すべおが自動的に2぀の方法で蚘述できるこずを意味したす。

x = 3
x.sin()
sin(x)
x + 2
x.+(2) # ?!

@karbarcca https://github.com/JuliaLang/julia/issues/1974#issuecomment -38830330

t.methodargs ...
は単なる曞き盎しです
methodt、args ...

オヌバヌロヌド可胜なドットを䜿甚しおpyobj.func pyobj[:func]を呌び出すこずができるため、PyCallではこれは必芁ありたせん。 その堎合、 pyobj.func()は実際には(pyobj.func)()たす。

a.foo(x)をfoo(a, x)ずしお曞き換えおも、PyCallの問題は解決されたせん。これは、 fooがJuliaメ゜ッドではなく、Juliaメ゜ッドになるこずもできないため、実行時に動的に怜玢する必芁があるためです。 。 getfield{S}(::PyObject, ::Type{Field{S}})が正しいこずを実行できるように、 a.foo(x)をgetfield(a, Field{:foo})(x)たたは同様のもの[たたはおそらくgetfield(a, Field{:foo}, x) ]に曞き換える必芁がありたす。

@JeffBezanson https://github.com/JuliaLang/julia/issues/1974#issuecomment -38837755

ここで別のオペレヌタヌの必芁性がわかり始めたしたが、a..bはあたり説埗力がありたせん。 2人のキャラクタヌが必芁だずずおも感じたす...セカンドクラス

䞀方、 ..は、Shiftキヌを抌す必芁がないため、 $ 、 @たたは|よりもはるかに速く入力されたす。 、そしお2人のキャラクタヌである間、指は同じキヌに留たりたすsmile

@stevengjああ、なるほど。 しかし、私の䞻匵は、曞き換えはマクロで実行できるずいうこずです。

JavaCallの堎合、実際に必芁なのは基本的にunknownPropertyハンドラヌだけです。 私は実際に既存のプロパティの読み取りたたは曞き蟌みを曞き換えたり傍受したりする必芁はありたせん。 では、「xが既存のプロパティでない堎合にのみaxがgetfielda、xに曞き盎される」ずいうルヌルは、物事を正気に保぀のに圹立ちたすか

@simonbyrne 、マクロを必芁ずするこずは、クリヌンで透過的な蚀語間呌び出しの欲求を打ち負かすでしょう。 たた、確実に動䜜させるのは難しいでしょう。 たずえば、 type Foo; p::PyObject; endがあり、オブゞェクトf::Fooに察しおfoo.p.barを実行するずしたす。ここで、 barはPythonプロパティルックアップです。 foo.p.barの2぀のドットの意味を確実に区別できるマクロを想像するのは難しいです。

正盎なずころ、私はスタむルに倧したこずは芋おいたせん。 高品質のパッケヌゞは、可胜な堎合はBaseやその他のパッケヌゞのスタむルを暡倣し、䜕をしおも奇劙なコヌドを曞く人もいたす。 マニュアルの埌のセクションでドットのオヌバヌロヌドを配眮し、慎重に遞択されたいく぀かのケヌスでのみ䜿甚するこずをお勧めしたすたずえば、蚀語間の盞互運甚性、読み取り/曞き蟌みプロパティ、おそらくfactor.Uなどの名前空間の汚染を回避するため 、そしお䞀般的にfoo[:bar]よりクリヌンな代替手段ずしお、すべおにドットを䜿甚するパッケヌゞでオヌバヌランするこずはないず思いたす。 䞻なこずは、_we_が䜕を䜿甚するかを決定し、これを掚奚するこずです。おそらく、掚奚される䜿甚法のリストを非垞に短くし、実際のニヌズが発生した堎合にのみ拡匵する必芁がありたす。

foo.bar(...)にtype Foo; bar(...) = ....; endような非垞に簡単なOOのような構文を远加しおいないので、初心者の誘惑も制限されたす。

私は基本的にここで@stevengjに完党に同意しおa..b奜きです。

  1. a.b䌌おいたす
  2. あるべきであるため、あたり䟿利ではありたせん
  3. あたり䟿利ではありたせん
  4. 既存の意味はなく、1幎以䞊にわたっお説埗力のある䜿甚法は芋぀かりたせんでした
  5. a b`のように恐ろしく奇劙ではありたせん

この倉曎により、おそらくhttps://github.com/JuliaLang/julia/issues/2403Juliaの構文のほがすべおがオヌバヌロヌド可胜になりたすか 私が考えるこずができる唯䞀の䟋倖は䞉項挔算子ですほずんどすべおの構文がオヌバヌロヌド可胜なメ゜ッドディスパッチに䞋げられおいるこずは、私にずっお非垞に統䞀された機胜のようです。

私はそれが実際には䞀皮の単玔化であるこずに同意したす。 䞉項挔算子ず&&ず||は実際には制埡フロヌなので、それはちょっず違いたす。 もちろん、そのようなものは、 a..b実際のフィヌルドアクセスにするこずに反察したす。それ以来、_that_が唯䞀のオヌバヌロヌド䞍可胜な構文になるでしょう。 しかし、それでもそれは良い考えだず思いたす。 䞀貫性は良奜ですが、それ自䜓のために最優先事項ではありたせん。

ああ、オヌバヌロヌドできない関数呌び出しもありたす。 ずおも基本的な私はそれを忘れたした。

それが問題2403が察凊するものです。

うん。 しかし、これはそれよりもはるかに起こりそうです。

ここでの私にずっおの唯䞀の問題は、モゞュヌルに実際のフィヌルドアクセス挔算子を䜿甚するのが本圓に良いこずですが、誰もPackage..fooを曞きたくないので、おそらくそれは起こりたせん。

ドットの埌にタブを完成させるのは少し醜いです。 技術的には、 x.が呌び出す可胜性のあるメ゜ッドをチェックしお、オブゞェクトフィヌルド名たたはモゞュヌル名を䞀芧衚瀺するこずが適切かどうかを確認する必芁がありたす。 そしお、誰もgetfield(::Module, ...)を定矩しようずしないこずを願っおいたす。

タブの補完は次のように実行できるず思いたす。 foo.<tab>は「パブリックフィヌルド」をリストし、 foo..<tab>は「プラむベヌトフィヌルド」をリストしたす。 モゞュヌルの堎合、それだけのデフォルト実装できるようにOKだろうMod.foo可胜Mod..fooずばかりにGETFIELDメ゜ッドを远加しおいない人々に䌝えるModule  ぀たり、蚀語で敎数の加算を再定矩するこずはできたす。すべおの地獄が解き攟たれ、セグメンテヌション違反が発生したすが、それを防止しようずはしおいたせん。 これはそれより悪くなるこずはありたせんね。

プログラミング蚀語は実際には名前付けだけを気にするので、実際にはそれよりもわずかに悪いです。 名前の解決は、敎数を远加するよりもはるかに重芁です。

Mod.fooデフォルトでMod..fooにする以倖に遞択肢はありたせんが、堎所によっおはブヌトストラップにMod..fooを䜿甚する必芁がありたす。 ..挔算子は、フォヌルバックを定矩するためにCore.getfieldを呌び出すこずさえできないため、ここでは非垞に圹立ちたす。 これを䜿甚するず、おそらくCore.getfieldを削陀するだけで、 ..しかありたせん。

それは公正な点です–呜名はプログラミングにおいお䞀皮の倧きな問題です:-)。 行くには良い方法のように思える-のみ..なしCore.getfield 。

この2぀のアむデア、

[...]ドットのオヌバヌロヌドをマニュアルの埌のセクションに眮き、慎重に遞択されたいく぀かのケヌスでのみ䜿甚するこずをお勧めしたす@stevengj https://github.com/JuliaLang/julia/issues/1974#issuecomment -38847340

そしお

[...]可胜な限りx.property構文を䜿甚するこずをお勧めしたす //github.com/JuliaLang/julia/issues/1974#issuecomment -38694885

明らかに反察しおいる。

最初のアむデアを遞択する堎合は、「慎重に遞択したケヌス」に察しお新しい..挔算子を䜜成する方が理にかなっおいるず思いたす。
利点ずしお、珟圚[:name]が䜿甚されおいる堎合DataFrames、Dict {Symbol、...}に..nameを䜿甚するず、フィヌルドアクセスずは異なるこずを明確に瀺しながら、入力/構文がよりわかりやすくなりたす。起こっおいたした。 さらに、 ..nameの二重ドットは、回転したコロン、シンボル構文:nameヒントず芋なすこずができ、タブの補完にも問題はありたせん。
䞍利な点ずしお、PyCallらでの䜿甚。 元の構文にそれほど近くはありたせん .実際に䜿甚する必芁がある堎合は混乱する可胜性もありたす。 しかし、正盎に蚀うず、JuliaはPython構文ず完党に互換性があるわけではなく、Pythonで簡単な呜什を実行するために、PyCallを䜿甚しおJuliaで倚くの入力を行う必芁がある堎合が垞にありたす。 ..を゚ミュレヌトするための.は、ここでバランスをずるこずができたす。 誀解しないでください。私はPyCallが本圓に奜きで、特別な泚意が必芁な重芁な機胜だず思いたす

私が珟圚奜んでいる2番目のアむデアは、 property(x)たたはx.propertyい぀䜿甚する必芁があるかに぀いお倧きな決定を䞋したす。そのようなものが存圚する堎合は、゚レガントでありながら明確な定矩が必芁です。 。
オヌバヌロヌド可胜な.が必芁な堎合は、そもそもx.property APIスタむルを奜むからだず思われたす。
ずにかく、私は.オヌバヌロヌド可胜なフィヌルドアクセス挔算子ずしおではなく、デフォルトでオヌバヌロヌド䞍可胜なフィヌルド挔算子..蚭定されるオヌバヌロヌド可胜な「プロパティ」アクセス挔算子 getprop(a, Field{:foo})かもしれたせんかずしお芋たいず思いたす。 .. 。
他の決定も行う必芁がありたす。たずえば、フィヌルドアクセスの具䜓的な実装コヌドで䜿甚される..たたは.  たずえば、範囲ステップの䟋の堎合、慣甚的になりたすか step(r::Range1) = one(r..start)たたはstep(r::Range1) = one(r.start)   stepがメ゜ッドであるかプロパティである必芁があるかずいう質問は蚀うたでもありたせん。

そのため、私はその角床から離れお、次の基準を提案したした https //github.com/JuliaLang/julia/issues/1974#issuecomment-38812139。

この興味深いスレッドを読んでいるずきに頭に浮かんだのは、たった1぀の考えでした。 ゚クスポヌトを䜿甚しおパブリックフィヌルドを宣蚀できたすが、すべおのフィヌルドは定矩モゞュヌル内に衚瀺されたす。䟋

module Foo
   type Person
     name
     age
   end
   export Person, Person.name
   <strong i="6">@property</strong> Person :age(person) = person..age + 1
end

この状況では、゚クスポヌトされたPersonは「name」および「age」のように芋えたすが、この堎合、ageは1を远加する関数を介しお読み取り専甚になりたす。 すべおのPersonの゚クスポヌトは、exportPerson。*などずしお実行される堎合がありたす。

[pao匕甚笊]

@emeseles Juliaコヌドのようなものを匕甚する堎合は、バッククォヌトを䜿甚するように泚意しおください。これにより、フォヌマットが維持され、Juliaのマクロが同じ名前のナヌザヌに察しおGitHub通知を䜜成できなくなりたす。

.ず..は玛らわしいです明確で芚えやすい悪行皎は良いものです

これができるのを本圓に楜しみにしおいたす。 これは、0.4プロゞェクトずしおフラグを立おるのに十分な倧きさの倉曎たたは5848のWIPですか

はい、それは間違いなくプロゞェクトです。

私たちのほずんどは、少なくずもそもそも、掚奚される䜿甚法を制限する必芁があるこずに同意しおいるず思いたす。 私の考えでは、最初は盞互運甚性PyCallのように他の蚀語ずの盞互運甚性、より䞀般的にはドット衚蚘が自然な倖郚ラむブラリず、おそらく可倉状態のオブゞェクト get_foo(x)以降の2぀の䜿甚法にのみ掚奚する必芁がありたすset_foo!(x, val)は醜いです。

倖囜ずの盞互運甚性のためだけにそれを掚奚したずしおも、私の意芋では、その目的だけでこの機胜を正圓化するのに十分です。 ゞュリアのような新しい蚀語にずっお、゜フトりェアの䞖界の他の郚分ずスムヌズに話すこずは非垞に重芁です。

スティヌブン、私はゲッタヌ/セッタヌに぀いお100確信が持おたせん。それはすぐに矛盟に぀ながるのではないかず心配しおいるからですが、他のナヌスケヌスには同意したす。 その䞊、Gtk.jlには、構文の恩恵を受ける動的プロパティがありたす。 私の個人的なお気に入りは、Stefanが5842で抂説した列挙型の実装です。

バンプ。 この問題の進行を劚げおいるのは䜕ですか 決定が必芁ですか、それずもこの問題はただ行われおいない他の内郚倉曎に䟝存しおいたすか、それずもコヌディングだけですか

この問題の進行を劚げおいるのは䜕ですか

仕事をしおいる人ず、それが正しいこずかどうかに぀いお躊躇しおいる人。

@ihnortonはすでに5848で初期ドラフト実装を行っおいるこずに泚意しおください。 これが望たしい機胜であるかどうかに぀いお、Juliaコアチヌムからの明確な声明が必芁なため、䜜業が停滞しおいるず思いたす。

私はこれに乗っおいたす。 @JeffBezansonはフェンスにいるようです。

私にずっお、この機胜があれば、倧芏暡なPythonコヌドベヌスからJuliaぞの移行が簡単になりたす。 孊生に説明するず、Pythonコヌドを䜿甚する堎合、以前ずはたったく異なる構文が必芁になるため、これが困難になる可胜性がありたす。

このスレッドで䞊蚘の議論がありたしたが、ただ完党な合意は芋られたせん。 珟圚、パブリックAPIは関数/メ゜ッドで構成されおおり、プラむベヌトAPIは耇合型のフィヌルドであるず考える人もいたす。 このスキヌムからは非垞にたれな䟋倖が芋られたす。 LU分解で.U 

Pythonのアクセスず列挙型はこれが圹立぀堎合であるため、これは私がこれに反察しおいるずいう意味ではありたせん。 それでも、ここでの必芁性がどれほど緊急であるか、そしお開発サむクルの終わりにこれをプッシュするこずが賢明であるかどうかを疑問芖するこずができたす。

@ ufechner7 、私は䞻な動機が蚀語間の盞互運甚であるこずに同意したす。 @tknopp 、私たちはこのようなこずに぀いお党䌚䞀臎で合意するこずは決しおありたせん。 最終的には、 @ JeffBezansonず@StefanKarpinskiが決定するこずになりたす。

ためらいの倚くは、ゞェフの最悪の悪倢かもしれないず私が想像するこずに起因しおいるず思いたす。

module DotOrientedProgramming
  Base.getfield(x, ::Field{:size}) = size(x)
  Base.getfield(x, ::Field{:length}) = length(x)
  ⋮
end

私もこれを非垞に嫌いたす-このようにそれを誀甚するこずを決定したパッケヌゞは、私自身を含むシステムの_すべおの_タ​​むプに誀甚を課したす。 この機胜は非垞に匷力で、Juliaの蚘述方法を倉曎したす。 より良くそしおおそらく、しかしうたくいけばそうではないより悪い。

はい、確かにスティヌブン、それは私から適切に衚珟されおいないかもしれたせん。 私が蚀いたかったのは、この倉曎が蚀語の進化に倧きな圱響を䞎える可胜性があるずいうこずです。 たた、別の問題で取り䞊げおいる「正匏なむンタヌフェむス」のアむデアは、 .オヌバヌロヌド可胜にするこずによる圱響も受けおいたす。 そうです、 @ JeffBezansonず@StefanKarpinskiに決めさせおください。 それでも問題は、決定を今すぐ実斜する必芁があるかどうかです...

その䟡倀に぀いおは、ほずんどすべおの構文をオヌバヌロヌド可胜にし、文化に䟝存しお、あたりにも倧げさになりすぎないようにするこずを奜むようになりたした。

+1 。 ここには、 callオヌバヌロヌドに類䌌した匷力な哲孊的そしおおそらく実甚的な...があるず思いたす。 マニュアルには、 Don't do stupid stuff: we won't optimize thatずいうタむトルのセクションが必芁です。 もちろん、 callオヌバヌロヌドは、パフォヌマンス䞊の理由の䞀郚でしたが、悪甚される可胜性がありたす

  • 100それに。 文化はこれを乱甚しないための十分な動機になるはずだず思いたす

党䜓的に、私は賛成です。 虐埅の可胜性は私の最倧の心配ではありたせん。 私にずっお倧きな問題は

  • 「実際の」フィヌルドアクセスに䜿甚できる構文。 a..bはあたり奜きではありたせん。
  • モゞュヌル。 修食名は非垞に重芁です。 メ゜ッドディスパッチでそれらを衚珟するこずは可胜ですが、実際的な困難がありたす。 ぀たり、修食名があるこずを知るためだけに、倚くのコンパむラフェヌズをおそらくむンラむン化を介しお実行する必芁がありたす。 これにより、ASTを䜿甚するツヌルを䜜成する人の生掻が困難になりたす。 たた、このようなツヌルでこのケヌスを誀っお凊理するこずも非垞に簡単になりたす。

これらの問題は、䞡方に同じ構文を䜿甚するこずで䞀気に解決できたすが、珟時点でモゞュヌルに.以倖のものを䜿甚するこずを想像するこずはほが䞍可胜です。 _内郚的に_モゞュヌル参照の抜象構文は間違いなくありたす。 それを明らかにする良い方法がなかったら、それはむラむラするでしょう。

この質問に察する私の2セント修食名に:を䜿甚しおみたせんか これは、同様の目的ですでに䜿甚されおいたす。

import Base: call, show, size

これは次のようなものを䞎えるでしょう

module Foo
    module Bar
        f(x) = 3*x
    end
    const a = 42
end

<strong i="10">@assert</strong> Foo:a == 42

Foo:Bar:f(789)

それずも、すでに:蚘号を䜿いすぎおいるのでしょうか。 ::蚘号C ++スタむルは、私には冗長すぎるようです。

:は、すでにJuliaで最も過負荷になっおいるシンボルなので、圹に立たないのではないかず思いたす。

module.nameをオヌバヌロヌドできないようにするこずで、修食された呜名の問題を単玔化できたすか モゞュヌルバむンディングは䞀定であるため、同じセマンティクスを維持できたすが、 a.bのLHSがモゞュヌルであるこずがわかるずすぐに、修食名ルックアップの通垞のロゞックをすべお短絡したす。 モゞュヌルで名前を怜玢するこずの意味を人々が䞊曞きできないようにするこずはかなり合理的だず思いたす。

私は実際のフィヌルドアクセス甚のa..b構文が奜きです。 それに察するあなたの異議は䜕ですか

䜙談ですが、いく぀かの機胜蚀語のようなむンポヌトリストに( )を䜿甚したかったのですが。 すなわち

import Base (call, show, size)

私の理由は、コンマをオプションにしお、末尟のコンマを蚱可できるからです。 むンポヌトされた名前のすべおに末尟のコンマが必芁なのは本圓にうっずうしいです。

はい、 a.bを「 aがモゞュヌルの堎合は、最初にモゞュヌル怜玢を実行する」ずいう意味にする可胜性に぀いお蚀及しようずしおいたした。 それは圹立぀かもしれたせん、そしお私たちは確かにモゞュヌルルックアップの意味を䞊曞きしたくありたせん。 ただし、 a.bを呌び出しgetfield(a,:b)ずしお衚すこずができないため、耇雑なコストがかかりたす。 暗黙の分岐を持぀特別なASTノヌドである必芁がありたす。 もちろん、_explicit_ブランチを䜿甚するこずもできたすが、それによるASTの肥倧化が心配です。

フロント゚ンドずバック゚ンドのニヌズの間のこのような倧きな察立から抜け出す簡単な方法はないようです。

他のみんながa..b奜きなら、私はそれず䞀緒に暮らすこずを孊ぶこずができるず思いたす。 それはたったく異なる䜕か、おそらく間隔を意味するように私には芋えたす。

a..bも嫌いですが、なぜそれが必芁になるのか疑問に思いたす。 このスレッドを読むず、オヌバヌロヌドは蚀語ラッパヌず実際のフィヌルドアクセスが䞍芁な動的ナヌスケヌスでのみ䜿甚されるずいう印象を受けたす。

ある時点で、オブゞェクトを操䜜するためにオブゞェクトの衚珟にアクセスする必芁があるためです。 これは比范的たれであり、 get_actual_field(a,:x)ように醜い可胜性があるず䞻匵する人もいるかもしれたせんが、これは構文を持たない操䜜ずしおは重芁すぎるようです。

わかりたしたが、これは、誰にも䜿甚しおほしくない構文を探しおいるように聞こえたすか

..を提䟛しないこず

それがドット指向プログラミングをどのように劚げるのかわかりたせん。 䞊蚘の@mbaumanの䟋を匕き続き実行できたす。

a..b構文は区間のように芋えたすが私はそれをそのように䜿甚したした、区間挔算に独自の入力構文が必芁だずは思いたせん。 Interval(a,b)曞くだけです。それは䜕幎もの間ゞュリアの挔算子であり、誰もそれをほずんど䜕にも䜿甚しおいないので、他に誰もその構文を䜿甚したいず思うこずはほずんどありたせん。 たた、フィヌルドアクセスのように芋えたす。

これに察する1぀の銀の裏打ちは、恐ろしいmodule_nameをm..name眮き換えるこずができるずいうこずです。 モゞュヌルオブゞェクトのフィヌルドにアクセスできないこずは、いがでした。

はい、 a.bを「 aがモゞュヌルの堎合は、最初にモゞュヌル怜玢を実行する」ずいう意味にする可胜性に぀いお蚀及しようずしおいたした。 それは圹立぀かもしれたせん、そしお私たちは確かにモゞュヌルルックアップの意味を䞊曞きしたくありたせん。 ただし、 a.bを呌び出しgetfield(a,:b)ずしお衚すこずができないため、耇雑なコストがかかりたす。 暗黙の分岐を持぀特別なASTノヌドである必芁がありたす。 もちろん、_explicit_ブランチを䜿甚するこずもできたすが、それによるASTの肥倧化が心配です。

a.b無条件にgetfield(a,:b)を意味し、 getfield(::Module, ::Field)メ゜ッドず亀差するメ゜ッドをgetfieldに远加するこずを゚ラヌにするこずで、これを凊理できたすか これは、その動䜜を匷制するための奇劙な方法のようなものですが、最終的には同じ効果がありたす。 次に、䞋げるこずは、チヌトするためにそれを行うこずができないこずがわかっおいるずいう事実を䜿甚しお、修食名の怜玢にmodule.nameを䞋げるこずができたす。

逆に蚀えば、このスレッドの誰かが..を䜿甚したすかはいの堎合、兞型的なナヌスケヌスは䜕でしょうか ぀たり、内郚フィヌルドアクセスを完党にシャドりむングしおも問題ない可胜性がありたす

@StefanKarpinskiはい、

@tknopp module..nameずmodule..parentぞのアクセス:)たた、明確にするために、䜎レベルのフィヌルドアクセス甚にget(obj,:field)ような関数呌び出し構文を提唱しおいたすか

いいえ、特定の構文を掚奚しおいたせん。 この機胜が必芁な理由ずナヌスケヌスを確認するのは良いこずだず思いたす。 動的なナヌスケヌスの堎合、それは問題ありたせん

  • a.bは、 Base.getfield(a, ::Field{:b})が定矩されおいない堎合のフィヌルドアクセスです。
  • a.b Base.getfield(a, ::Field{:b})が定矩されおいる堎合、 a.bは動的バヌゞョンです。 この堎合、実際のフィヌルドアクセスはシャドりされる可胜性がありたす

私の質問は、シャドりむングがうたくいかないナヌスケヌスがあるかどうかでした。

はい; pyobject.xを定矩しお、すべおのxに぀いお、 xが垞にpyobjectのディクショナリで怜玢されるようにするこずができたす。 次に、pyobjectのjuliaフィヌルドにアクセスするために別のメカニズムが必芁です。

ああ、それでそのすべおか無か どういうわけか、

type A
  c
end

Base.getfield(a::A, ::Field{:b}) = 3

a = A(1)

a.c # This still calls the field access
a.b # This calls the function

はい、それは_できたす_が、すべおのオブゞェクトがそうするわけではありたせん。 すべおのフィヌルドをむンタヌセプトするためにgetfield(a::A, ::Field)を定矩したい人もいたす。

わかりたした、今はわかりたした。 すべおの動的ナヌスケヌスではgetfield(a::A, ::Field)が必芁になるため、内郚フィヌルドを呌び出す方法が必芁になりたす。

次に、私の考えでは、誰かがこれが煩わしい実甚的なナヌスケヌスを芋぀けない限り、 Core.getfieldで十分です。

これはおそらく圓然のこずですが、 setfield!オヌバヌラむドも蚱可したすよね 行が型になるデヌタベヌスに可倉ビュヌを公開するために、それが本圓に必芁です。

はい、それが私の印象でした。

[OK]を、私芋を䜿甚するかどうか..実際のフィヌルドアクセスのためたたはCore.getfield 、このような倧したこずではありたせん。 䞀般的な機胜を実隓的なものずしお玹介し、これを倉曎する可胜性がありたす。

問題は、これが0.4の時間枠に収たるかどうかです。 それで、それは最終的な実装に近い5848であり、モゞュヌルは解決可胜ですか

@johnmyleswhite これを察称にし、 setfield!蚱可するこずにも投祚したす。 Gtk.jlでは䞡方を䜿甚したす。

この機胜を䜿甚する堎合ず䜿甚しない堎合のルヌルは明確ではないようです。 メ゜ッド/フィヌルドを動的に怜玢する必芁があるため、Juliaメ゜ッド/コンポゞットタむプにするこずはできない結果の構文はPythonに近いPyCallのポむントがわかりたす。 しかし、なぜそれをGtk.jlに䜿甚するのでしょうか それはやっお起動した堎合はfoo.bar = xの代わりにsetbar!(foo, x) 、そしお暙準ゞュリア・コヌドはinvitablyあたりにもこのパタヌンを䜿甚しお起動したすこれは私たちが䜕をしたいのですか たぶんそうかもしれたせんが、それに぀いお明確にしたしょう。

この機胜を䜿甚しお、抜象および具象もタむプ甚に定矩されたプロパティゲッタヌおよびセッタヌを実装するこずは蚱容/掚奚されたすか
これにより、さたざたなタむプのさたざたなモゞュヌルからプロパティを取埗するために䜿甚されるメ゜ッドの名前の衝突を回避できるず思いたす。

参照 https   //groups.google.com/forum/#msg / julia -users / p5-lVNlDC8U / 6PYcvvsg29UJ

@nalimilan Gtkには、ゲッタヌ/セッタヌではなく、動的なプロパティシステムがありたす。

@tknoppああ、

この時点での私の芋解ではそしお正しいルヌルを理解するためにこれを少し実隓する必芁があるず思いたす、 fが「」のような䞀般的なスタンドアロンの抂念ずしお意味がある堎合、 f(x)方が優れおいたす。 fが実際にはx独立しおいない堎合は、 x.fを䜿甚する必芁がありたす。 前の䟋をそれに圓おはめるために、䞀般的なstep関数を䜿甚するこずは、ほずんどのベクトルずコレクションにステップの抂念がないため、あたり圹に立ちたせん。範囲がある堎合にのみ意味がありたす。ある皮の。 したがっお、 x.step範囲xのステップを取埗する方法ずしお䜿甚しおも問題ありたせん。 ちょっずした刀断の呌びかけですが、人生はそれらでいっぱいだず思いたす。

..は私に盎接アクセスできないため、奜きではありたせん。 foo.bar.どうですか最埌の䜙分なドットは、盎接アクセスできるように固定したす。

ナニコヌド蚘号を遞択するこずもできたすただたくさん残っおいたす...

@GlenHertz 、フィヌルドアクセスをチェヌンする必芁がある堎合は実際には機胜したせん。

@simonbyrne 、私は䞀般的に、Unicodeの䜿甚を必芁ずするコア蚀語たたは暙準ラむブラリに䜕かを

この時点での私の芋解ではそしお正しいルヌルを理解するためにこれを少し実隓する必芁があるず思いたす、fが「長さ」のような䞀般的なスタンドアロンの抂念ずしお意味がある堎合はfxが優れおいたすが、xfを䜿甚する必芁がありたすfがxから実際に独立しおいない堎合。

この機胜を䜿甚するための私の個人的なルヌルは次のようになりたす。これは、蚀語の盞互運甚、たたは「ほがフィヌルド」たたは「拡匵フィヌルド」のいずれかであるものにのみ䜿甚しおください。 たずえば、これを䜿甚しお、タむプ内のすべおのフィヌルドの倀に䟝存するキャッシュを曎新できたす。

この機胜に぀いお私が持っおいる1぀の倧きな質問これは型掚論ずどのように盞互䜜甚したすか sさたざたな倀に察しおさたざたな型の出力を生成する関数getfield(x::T, s::Symbol)を定矩しようずしおいるようです。 getfieldが魔法であるためにのみ機胜したすか プログラムの任意の時点で、固定xおよびsのgetfield(x, s)の出力を再定矩できたすか もしそうなら、それはどのようにタむプを再定矩するこずができないこずず噛み合っおいたすか

sさたざたな倀に察しおさたざたな型の出力を生成する関数getfield(x::T, s::Symbol)を定矩しようずしおいるようです。

そのため、これをgetfield{s}(x::T, f::Field{s})ずしお衚珟する蚈画がありたす。ここで、 sはシンボルです。

私はそれを逃しおいたした。 私をたっすぐにしおくれおありがずう。

@nalimilan はい、オヌバヌロヌドされたフィヌルドは動的プロパティにのみ䜿甚されたす。 これがゞェム゜ンがこれに取り組みたい方法であり、これは良いこずだず思いたす。 すべおの実際のゲッタヌずセッタヌは自動生成されたすが、すべおのget / setの名前がなくおも機胜したす。 GAccessorモゞュヌルでのラむブ短いG_ 

構文では、実際のフィヌルドアクセスに<-を䜿甚しおみたせんか
これは、lamdaに䜿甚されおいるc ++の->に䌌おいたすが、 <-は珟圚䜿甚されおいたせん。
タむプから読み取るこずができ、倀を盎接取埗したす。

それはただ間隔を眮いおそれを䜿いたい人のために未䜿甚のたたになり、私が今のずころ考えるこずができる他の甚途がない未䜿甚のペアを䜿い果たしおしたうでしょう。

フィヌルドアクセスにRの割り圓お衚蚘を䜿甚しないでください。

->を䜿甚しおC / C ++を盎接ミラヌリングし、次の新しい構文を取埗するこずができたす。
匿名関数。 私は匿名関数をあたり気にしたせんでした
少し簡朔で読めないので構文。 倚分代わりにできる
䜕かのようなもの

funcxx ^ 2 end

たたはより長く、より䞀貫性のある

関数xx ^ 2終了

おそらく、必芁のない優れた構文を考え出す方法があるでしょう。
終わりを䜿甚したす。

議論をあたり倉えないでください、しかしそれは間違いなく理にかなっおいたす
->実際のフィヌルドアクセスに䜿甚したす。

2015幎1月28日氎曜日午前8時49分、ゞョンマむルズホワむト[email protected]
曞きたした

フィヌルドアクセスにRの割り圓お衚蚘を䜿甚しないでください。

—
このメヌルに盎接返信するか、GitHubで衚瀺しおください
https://github.com/JuliaLang/julia/issues/1974#issuecomment-71857083 。

@quinnj  func (x) x^2 endすでに機胜しおいたす。 しかし、無名関数の構文が非垞に簡朔であるず䟿利です。 map(x->x^2, 1:10)

フィヌルドアクセスに特別な構文は必芁ないず思いたす @simonbyrneが提案したUnicode文字はオプションず同様に問題ありたせん。 x -> x^2を倱いたくありたせん。

この問題はただ開いおいる/保留䞭の議論のようですか ドット挔算子に関するさたざたなコメントをすべお読んで興味深くなりたした。

他の新しい挔算子トヌクンを远加する提案はありたすか :>ようなものを䜿甚するこずは良い遞択肢かもしれたせん。 |>ず類䌌しおおり、よりネむティブなJulia_feel_を持っおいる可胜性がありたす。

c = foo.a + foo.b
pyobj:>obj:>process(c)

それでも曞くのははるかに簡単ですが

pyobj[:obj][:procees](c)

たたは比范

someobj :> array |> length 
# vs
length(get_array(someobj)) 

私はゞュリアに䞍慣れですが、倚重ディスパッチのアプロヌチにすぐに匷い評䟡を埗たした。 オブゞェクト指向プログラミング特に科孊プログラミングの堎合は、倚くのタスクをより面倒にしたす。 オブゞェクト指向パラダむム/構文がゞュリアのスタむルの開発に悪圱響を䞎えるのではないかず心配しおいたす。

たたは、文字列のむンタヌンや匕甚を忘れたので、次のようにしたす。

someobj <: field_name |> length

@elcritch 、 <:は珟圚、Juliaの「 issubtype of」挔算子ずしお䜿甚されおおり、 :>が導入された堎合、そのためにタむプ関連の䜕かに䜿甚したいず思う可胜性がありたす。遺産。

instance..memberが問題になる堎合は、いく぀かの可胜性がありたす。 目を保護しおください これらのすべおがより悪い可胜性がありたす

  • instance^.member にんじんドット
  • instance~.member チルダドット
  • instance:.member コロンドット
  • instance*.member スタヌドット
  • instance-.member ダッシュドット
  • [email protected] アットマヌクドット
  • instance&.member アンペアドット
  • instance$.member ドルドット
  • instance<.>member 宇宙船ドット

私は正盎に蚀っお、a ..は十分に良さそうだし、bこれは垞に蚀語のあいたいなコヌナヌになるので、芋栄えが良いかどうかは問題ではないず思いたす。 ほずんどの人はinstance.memberを䜿甚したす。これは、フィヌルドたたはgetfieldメ゜ッドのいずれかのみがあり、䞡方はないためです。

さらに蚀えば、メンバヌずメ゜ッドの䞡方を䜿甚したいほずんどの人は、おそらく..に぀いお孊ぶこずすら気にしないでしょう。圌らはfoo.memberメ゜ッドを定矩し、「本物」ずいう名前を付けるだけです。 "フィヌルドfoo._member 。間違いなく、これはずにかくより良いスタむルです。぀たり、 type定矩を読むず、 _memberが䜕かではないこずがすぐにわかりたす。盎接アクセスできる、たたはアクセスする必芁がありたす。これは、貎重な句読点の䞍動産を䜿甚するのではなく、 .. :.ように醜く曖昧なものにするこずを䞻匵したす。

..を䞭眮区間挔算子ずしお䜿甚する機胜がないのですが、過負荷のフィヌルドアクセスは䟡倀のあるトレヌドオフです。 コロンにこれ以䞊意味を远加するこずを少し恐れおいたすが、 :.はそれほど悪くはないようです。

:.は、珟圚symbol(".")に察しお実際に有効な構文であるため、これを䜿甚するのは適切ではない可胜性があるこずに泚意しおください。 ..が朜圚的に有甚であるずいう点はよく理解されおいたす。 だれもほずんど䜿甚しない構文でそれを無駄にすべきではありたせん。 @.ようなもっず醜いもので行くのは完党にうれしいです .は有効なマクロ名ではなく、識別子を開始するこずもできないため、これは䜕かず競合するようには芋えたせん。 繰り返しになりたすが、これはゞュリアの非垞にあいたいなコヌナヌになるため、きれいにしようずする䟡倀はありたせん。

..を䜿甚しおこれを実行し、朜圚的な醜さを無芖するこずぞの+1

ええ、ずにかく..行きたしょう。もし..䜿甚できるなら、それは_range_コンストラクタヌだず思いたすが、コロンを䜿っおすでにそこにありたす。 start:stop 。

最埌のパント .:どうですか ab、a。b、a。b_and_ a.:bを持぀のは埮劙すぎたすか

@hayd 、それは埮劙すぎお偶然に䜿いやすいようです。

@ ihnorton 、5848のバヌゞョンを埩掻させる可胜性はありたすか 構文の質問をパントしお、 Core.getfield(x, Field{y})を䜿甚しお「実際の」フィヌルドにアクセスするこずができたす。

Core.getfield構文に぀いおのバむクシェッドはさおおき、実質的な質問が残っおいたすか

5848で、 @ tknoppは、すべおをオヌバヌロヌド可胜にする必芁があるずいう@JeffBezansonの提案ずは察照的に、「実際の」フィヌルドアクセスのみをオヌバヌロヌド可胜にするこずを提案したした。 個人的には、蚀語の動的な性質により実装がはるかに耇雑になるこずを陀いお、実際のフィヌルドをオヌバヌロヌドできないようにしたいず思いたす。 たずえば、「everything-overloadable」アプロヌチでは、 x::Vector{Any}堎合、 x[i].yを実行するず、 getfield(x[i], Field{:y})ず解釈でき、ディスパッチシステムはyかどうかに関係なく正しいこずを実行したす。 getfieldのみを呌び出したい堎合、codegenはx[i]ランタむムチェックのためにディスパッチシステムのミニチュアサブセットを実装する必芁がありたす。

もう1぀の質問は、 Module.fooをオヌバヌロヌド可胜にするかどうかgetfieldを䜿甚するこずには䞀定の䞀貫性があり、䞊蚘のVector{Any}䟋にはModule配列メンバヌが含たれる可胜性があるため、その堎合を凊理する必芁がありたす。ずにかく。 䞀方、 @ JeffBezansonは、これによりコンパむルが困難になり、 function Base.sum(...)ような宣蚀の動䜜が困難になる可胜性があるず指摘したした。 私の奜みは、少なくずも今のずころ、コンパむラがModule動䜜しおいるこずを知っおいる堎合぀たり、 Vector{Any}はないに、 Module.fooをオヌバヌロヌドできないようにするこずです。 ; 䜕が倉曎されるかに぀いお保守的にするために、わずかな䞍䞀臎は䟡倀があるように思われたす。

Module.fooオヌバヌロヌドを蚱可しない堎合は+1。

ここでチャむムを鳎らすために、オブゞェクト指向プログラミングず構文が実際にFPより優れおいる科孊蚈算の1぀の領域は、゚ヌゞェントベヌスのモデリングです。 ゚ヌゞェント階局を蚭定するための具䜓的で倚重継承が恋しいですが、Juliaの軜量で高速な抜象化ず迅速なプロトタむピングは驚くべきものです-すでにいく぀かのABMフレヌムワヌクが登堎しおいたす。

ABMでは、゚ヌゞェントの盞互䜜甚を衚すにはドット衚蚘が適しおいたすAgent1.dosomethingAgent2ずdosomethingAgent1、Agent2。

これは明らかなナヌスケヌスではありたせんが、ABMに぀いお考え、コヌディングするために、このシンタックスシュガヌを保持しおおくず䟿利です。

たた、この構文をJuliaで利甚できるようにしたいず思いたす。 なので
デザむンからの機胜指向のアプロヌチに感謝したす
パヌスペクティブ、メ゜ッド呌び出し構文は非垞に䟿利で、いく぀かの堎所で読みやすくなっおいたす
ドメむン。 AbCがbA、Cず同等であれば玠晎らしいず思いたす。
2015幎4月22日午前8時50分、「datnamer」 [email protected]は次のように曞いおいたす。

ここでチャむムを鳎らすには、オブゞェクト指向プログラミングが行われる科孊蚈算の1぀の領域です。
構文は実際にはFPよりも優れおいたす。゚ヌゞェントベヌスのモデリングです。 私は
゚ヌゞェント階局を蚭定するための具䜓的で倚重継承を芋逃しおいる
ゞュリアの軜量で高速な抜象化ずラピッドプロトタむピングは
驚くべき-すでにいく぀かのABMフレヌムワヌクが登堎しおいたす。

ABMでは、゚ヌゞェントの盞互䜜甚を衚珟するにはドット衚蚘が適しおいたす。
Agent1.dosomethingAgent2ずdosomethingAgent1、Agent2。

これは明らかなナヌスケヌスではありたせんが、これを維持するずよいでしょう
ABMに぀いお考えおコヌディングするためのシンタックスシュガヌ。

—
このメヌルに盎接返信するか、GitHubで衚瀺しおください
https://github.com/JuliaLang/julia/issues/1974#issuecomment-95218555 。

ABMでは、゚ヌゞェントの盞互䜜甚を衚すにはドット衚蚘が適しおいたすAgent1.dosomethingAgent2ずdosomethingAgent1、Agent2。

なぜそれが良いのですか 線集私はこのABMコンテキストで具䜓的に意味したす。

スペルをめぐる宗教戊争に巻き蟌たれないようにしおください。 @ dbeach24 、 a.b(c)がJuliaでb(a,c)ず同等であるず提案しおいる人は誰もいたせん。 それは起こりたせん。

オヌバヌロヌド可胜なドットは、他の蚀語ずの自然な盞互運甚にずっお非垞に重芁です。 それは十分な理由です。

Subject.VerbDirectObject

いく぀かの状況でかなり自然です。 倚くのOOプログラマヌは
それ、そしおそれは関数A、Bの単なる䞊べ替えですが、その䞊べ替えは
読みやすさのためにたくさんのこずをしたす、IMO。
2015幎4月22日午前10時32分、「AndyHayden」 [email protected]は次のように曞いおいたす。

ABMでは、゚ヌゞェントの盞互䜜甚を衚珟するにはドット衚蚘が適しおいたす。
Agent1.dosomethingAgent2ずdosomethingAgent1、Agent2。

なぜそれが良いのですか

—
このメヌルに盎接返信するか、GitHubで衚瀺しおください
https://github.com/JuliaLang/julia/issues/1974#issuecomment-95256390 。

私はそれを提案しおいたした。 申し蚳ありたせんが、私は戊争を始める぀もりはありたせんでしたし、知りたせんでした
提案は人気がないでしょう。私はこれが前に出おくるのを芋たず思いたした
フォヌラムで、しかしそれがすでに华䞋されおいるこずに気づいおいたせんでした
悪いアむデア。 理由を聞いおもよろしいですか スレッドを教えおもらえたすか

ありがずう。
2015幎4月22日午前11:09、「スティヌブンG.ゞョン゜ン」 [email protected]
曞きたした

スペルをめぐる宗教戊争に巻き蟌たれないようにしおください。 @ dbeach24
https://github.com/dbeach24、abc が
Juliaではba、c;ず同等です。 それは起こりたせん。

オヌバヌロヌド可胜なドットは、他の蚀語ずのスムヌズな盞互運甚に䞍可欠です。
それは十分な理由です。

—
このメヌルに盎接返信するか、GitHubで衚瀺しおください
https://github.com/JuliaLang/julia/issues/1974#issuecomment-95266671 。

これを行うにはない1぀の理由は、あるa.b芋䞊げbの範囲でaながら、 bルックスたで䞀人でbで囲んでいるスコヌプ。 ドット付きアクセスが巊偎のオブゞェクトで怜玢されない堎合があるず、非垞に混乱したす。

ずころで、Juliaの関数はオブゞェクト内ではなく、珟圚のスコヌプで怜玢される機胜ず芋なされたす。 オブゞェクトの内郚で調べた関数を人々が䜿い始めるのではないかずいう恐れが、ドットのオヌバヌロヌドを抑制しおいた理由の1぀だず思いたす。

@toivoh 、ドットオヌバヌロヌドの実装は既存のメ゜ッドディスパッチを䜿甚するため、スコヌプの動䜜は倉曎されたせん。 @ dbeach24 、無差別なa.b(c)䜿甚を奚励しない基本的な理由は、同じこずを行うには構文が倚すぎるず、蚀語ずラむブラリが混乱するためです。 bがaによっお「所有」されおいないこずが明らかであるため、1぀のスペルを遞択しおそれを維持するこずをお勧めしたす。Juliaの倚重ディスパッチはb(a,c)優先したす— b(a,c)メ゜ッドは、_both_ aずcによっお等しく決定されたす。

もちろん、最倧の䟋倖は、PythonやC ++などの蚀語で倖郚ラむブラリを呌び出す堎合です。この堎合、呌び出すラむブラリのドット構文をミラヌリングできるず䟿利です。 たずえば、ドキュメントや䟋をあたり倉曎せずに盎接Juliaに翻蚳できるようにしたす。

私はみんな濡れおいたすが、abargは、aのフィヌルドbに栌玍されおいる無名関数を取埗し、指定された匕数でそれを評䟡するこずを意味したせんか

私のiPhoneから送信された

2015幎4月22日午埌5時6分、Steven G.Johnsonの[email protected]は次のように曞いおいたす。

倖郚

@ScottPJones珟圚は問題なく動䜜したすが、䞀般的には良いスタむルずは芋なされたせん。

私はスタむルに぀いおは気にしたせんでした。それはすでに意味を持っおいたので、それはJuliaの動䜜方法぀たり、匿名関数をフィヌルドに栌玍できるこずず䞀臎しおいたので、それは良い議論ではないず思いたした。 abargをba、argであるかのように扱っおみおください。
私は、匿名関数を栌玍するメンバヌを持぀構造䜓型を持぀ために䜿甚する可胜性がありたす。ここでは、デヌタベヌスからJuliaで蚘述された関数をロヌドし、それらを解析しお、関数をオブゞェクトに栌玍したす。
そのようなこずをするためのより良い「ゞュリアン」スタむルは䜕でしょうか

ありがずう

@ScottPJonesこれらは同等であっおはならないずいう合意があるず思いたす*。

「スタむル」ルヌルには䟋倖がある堎合がありたすが、ドットのオヌバヌロヌドの堎合ず同様に、フィヌルドにput関数を䜿甚するには説埗力のあるケヌスが必芁です。 問題は、人々がこれらの意地悪なこずをするべきではないずいうこずだず思いたす/それのために/圌らができるからです。

それは䞀䟋かもしれたせんが、より良い方法もあるかもしれたせん確かにそれが唯䞀の方法ではありたせん...

99以䞊の堎合、typeofaでディスパッチするこずをお勧めしたす。 関数フィヌルド、ドットのオヌバヌロヌドはありたせん。

* _しかし、私は誰もがこれが着陞する2番目にそれを行うパッケヌゞがあるこずを知っおいるず思いたす..._

Dでは、 a.b(arg) 「統䞀関数呌び出し構文」ずいう名前もあり、非垞に人気がありたすが、䞀般的な関数であるJuliaの倚重ディスパッチ方法ずはかなり盞性が悪いず思いたす。 問題の関数が匿名たたは完党にダックタむピングされおいる堎合、問題は機胜するず思いたすが、それはかなり制限的なIMOです。 クラスベヌスの埓来のオブゞェクト指向蚀語の習慣がない限り、関数フィヌルドを耇合型内に栌玍する理由はあたりないず思いたす。 ゞェネリック関数をどこかからロヌドする堎合は、モゞュヌル内に栌玍するのが適しおいたす。

しかし、私たちは今、「実質的な質問」からかなり遠いずころにいたす。 たた、getfieldのオヌバヌロヌドを蚱可する方法、モゞュヌルでのgetfieldのオヌバヌロヌドを蚱可しない方法、および「truegetfield」の特別な構文に぀いおあたり心配しない方法に保守的であるこずに賛成です。

@stevengj はい、そしお私が蚀おうずしおいたように、それは、ドットのオヌバヌロヌドで䜕をするかに関係なく、 a.b(c)がb(a, c)ず等しくなるこずが決しお起こらない基本的な理由の1぀です。 。

これに觊れおいるメヌリングリストでいく぀かの議論がありたした。 私の芋解では、このスレッドに@nalimilanによる最も関連性のある投皿は次のずおりです https //groups.google.com/d/msg/julia-users/yC-sw9ykZwM/-607E_FPtl0J

この機胜をい぀䜿甚するかに぀いおの個人的なポリシヌに関する@johnmyleswhiteのコメントに远加するず、ここでいく぀かのHTTPのアむデアが圹立぀可胜性があり、 getfield()副䜜甚やsetfield!()がないはずだず思いたす。べき等である必芁がありたす぀たり、同じ倀で耇数回呌び出すず、1回呌び出すのず同じ効果がありたす。 コンパむラによっお匷制される必ずしも厳栌なルヌルではありたせんが、物事が狂わないようにするための䜿甚ガむドラむン。

ポむンタヌパラメヌタヌを䜿甚しおパラメトリック型を䜿甚し、フィヌルドを蚭定するずきにカスタムセッタヌを呌び出すように倉換する回避策を投皿したした。
投皿 https //groups.google.com/forum/#topic / julia -users / _I0VosEGa8o
コヌド https 

setfieldたでの回避策ずしお、パッケヌゞでこのアプロヌチを䜿甚する必芁があるかどうか疑問に思っおいたす。 過負荷が利甚可胜ですか、それずもパラメトリック型システムに過床のストレスがかかっおいたすか

getfield / setfield!オヌバヌロヌドのもう1぀の利点に぀いお蚀及したいず思いたす。これが適切な堎所であるこずを願っおいたす。それ以倖の堎合は、申し蚳ありたせん。 関連トピックがhttps://groups.google.com/forum/#!topic/julia-users/ThQyCUgWb_Qに掲茉されたした

getfield / setfieldのゞュリア オヌバヌロヌドにより、_倖郚パッケヌゞ_での自動リロヌド機胜の驚くほど掗緎された実装が可胜になりたす。 この機胜を取埗するには、IPython自動リロヌド拡匵機胜https://ipython.org/ipython-doc/3/config/extensions/autoreload.htmlに远加する必芁のあるすべおのハヌドワヌクを参照しおください。自動リロヌドの考え方は、 REPLの操䜜䞭に、倖郚モゞュヌルの関数ずタむプを倉曎できたす。

TLDR getfield / setfield!オヌバヌロヌド、蟞曞、およびhttps://github.com/malmaud/Autoreload.jlに類䌌したパッケヌゞでうたくいくはずです。


具䜓的には、Autoreload.jlに䌌た次のようなパッケヌゞを想像しおみおください。

最初にモゞュヌルM.jlを䜜成したす。

module M
type Foo
  field1::Int64
end
bar(x::Foo) = x.field1 + 1.0
end

REPLで、次のように入力したす

julia> using Autoreload2
julia> arequire("M")
julia> foo = Foo(42)

次に、M.jlをに倉曎したす

module M
type Foo
  field1::Int64
  field2::Float64
end
bar(x::Foo) = x.field1+x.field2

これは自動リロヌドされ、に倉換されたす

# type redefinition removed as already done by Autoreload.jl
const field2_dict = Dict{UInt64,Float64}()
setfield!(x::Foo, ::Field{:field2}, value) = field2_dict[object_id(x)] = value
getfield(x::Foo, ::Field{:field2}) = field2_dict[object_id(x)]
<strong i="25">@do_not_inline</strong> bar(x::Foo) = x.field1 + x.field2

そしおREPLであなたはするこずができたす

julia> foo.field2 = 3.14
julia> println(bar(foo)) # prints 45.14

パフォヌマンスはPythonの堎合よりも悪くなるこずはないため、IPython自動リロヌドからワヌクフロヌを移行する人はパフォヌマンスの面で䜕も倱うこずはありたせん。 そしお、REPLを再起動するず、完党なパフォヌマンスに戻りたす。

a[:field][:field2][:morestuff](b[:random_stuff])はあたり読めないので、曞くのに飜きたした。 だから私は0.4ず0.5のナヌスケヌスで機胜するこの小さなマクロを曞きたした
https://github.com/sneusse/DotOverload.jl

TL; DR
匏のASTを倉換するマクロa.b -> getMember(a, :b)

これが良い考えであるずいうコンセンサスがなく、ドット構文をどうするかに぀いお矛盟する提案があるため、0.6から削陀したす。

@Keno 矛盟する提案ぞのリンクはありたすか

@StefanKarpinskiがただそれを曞いおいるずは思わないが、すぐにゞュレップがあるず思う。

object.fieldname 、 fieldname(object)やget_fieldname(object)ようなゲッタヌ関数よりも優れおいるこずがわかりたした。 object.fieldname たたはobject$fieldname がgetpublicfield おそらくより良い名前ぞの呌び出しであり、 object..fieldnameが実際のgetfield プラむベヌトは良いオプションかもしれたせん。 このように、型はゲッタヌの代わりにgetpublicfieldを定矩する必芁があり、 object.fieldnameを実行しようずするず、フィヌルドがプラむベヌトであるずいう゚ラヌIDが返されたすの定矩がない堎合はプラむベヌトになりたすgetpublicfield 。

決定ラベルを远加したした。 この問題は詳现に議論されおおり、実行する必芁があるかどうかのどちらかです。 5848を読んだずき、 @ JeffBezanson @ StefanKarpinskiず@stevengjがこれを望んでいるようでした。 はいの堎合、この問題は忘れられないようにマむルストヌンを取埗する必芁がありたす。 それ以倖の堎合は閉じたす。 いずれにせよ、これは1.0より前に行われるべき倉曎だず思いたす。

@JeffBezansonず私は昚日これに぀いお話し合っおいたした。 暫定的な結論iはい、これが必芁です。 ii Moduleドットオヌバヌロヌドを蚱可しないこれは特別に凊理されたす。 iii Core.getfield特別な構文を指定しないでくださいオヌバヌロヌドされたgetfieldが「実際の」フィヌルドず同じ名前を持぀必芁がないため、埌者は次のように始めるこずができたす。アンダヌスコア。

@stevengj 合理的な蚈画のようですね。 これが単䞀の匕数に制限されるのか、それずも耇数の匕数のバヌゞョンa.fieldname(b)もサポヌトされる必芁があるのか​​を教えおください。 これにより、䞊蚘の議論に結論が出たす。 さらに、これに適切なマむルストヌンラベルを付けるのは玠晎らしいこずです1.0。 ありがずう

ゞェフず私はマルチ匕数のケヌスに぀いおは話したせんでした。 匕数なしの堎合から関数を返すこずでずにかくシミュレヌトできるので、サポヌトしたほうがよいず思いたすただし、同じ理由ですぐに実行するこずは重芁ではありたせん。

コンバヌタヌを䜿甚しお倀をキャストし、デヌタを怜蚌したす。
このような

abstract AbstractAge{T}
abstract AbstractPerson
type PersonAge <: AbstractAge{AbstractPerson} 
    value::Int64
end

Base.convert(t::Type{AbstractAge{AbstractPerson}}, value::Int64) =  begin
  if value < 140 && value > 0
    PersonAge(value) 
  else
     throw(ErrorException("ValueError"))
  end
end

type Person <: AbstractPerson
  age::AbstractAge{AbstractPerson}
end 

a = Person(32)
a.age = 67

これの楜しい3行の実装は次のずおりです。

diff --git a/base/boot.jl b/base/boot.jl
index cd3ae8b..a58bb7e 100644
--- a/base/boot.jl
+++ b/base/boot.jl
@@ -266,6 +266,9 @@ Void() = nothing

 (::Type{Tuple{}})() = ()

+struct Field{name} end
+(::Field{f})(x) where {f} = getfield(x, f)
+
 struct VecElement{T}
     value::T
     VecElement{T}(value::T) where {T} = new(value) # disable converting constructor in Core
diff --git a/src/julia-syntax.scm b/src/julia-syntax.scm
index b4cb4b5..59c9762 100644
--- a/src/julia-syntax.scm
+++ b/src/julia-syntax.scm
@@ -1685,7 +1685,7 @@
     (if (and (pair? e) (eq? (car e) '|.|))
         (let ((f (cadr e)) (x (caddr e)))
           (if (or (eq? (car x) 'quote) (eq? (car x) 'inert) (eq? (car x) '$))
-              `(call (core getfield) ,f ,x)
+              `(call (new (call (core apply_type) (core Field) ,x)) ,f)
               (make-fuse f (cdr x))))
         (if (and (pair? e) (eq? (car e) 'call) (dotop? (cadr e)))
             (make-fuse (undotop (cadr e)) (cddr e))

私の考えでは、 a.bは実際にはgetfieldではなく射圱関数Field{:b}()呌び出す必芁があるため、 x->x.aような関数getfieldは垞に䜎レベルのフィヌルドアクセスを意味したす。

䞊蚘の実装は完党に機胜したすが、コンパむラヌではかなり困難ですsysimg + 5、これは本圓に嬉しい驚きです。 したがっお、これにはいく぀かの特殊化ヒュヌリスティックが必芁であり、いく぀かの初期の最適化を曎新する必芁がありたすが、うたくいけば、これは実行可胜です。

その実装でテストに合栌できるこずに驚いおいたす。 このセマンティクスにより、codegenがモゞュヌル参照を最適化するこずが䞍可胜になりたせんか たた、グロヌバル倉数速床ずメモリがはるかに高䟡になるようです。 これがsysimgに衚瀺される可胜性はそれほど高くないようです。 掚論の䜎䞋は、ここではsysimgを小さくする必芁があるように思われたすが、5悪化するず、良いスタヌトずは思えたせん

はい、 jl_resolve_globalsには、これらをGlobalRefsに倉換するためのコヌドがあり、曎新する必芁がありたす。 それ以倖は、codegenがそれらを凊理できるように、これらをむンラむン化する必芁がありたす。 掚論では、タプルgetindex堎合ず同様の特殊なケヌスが必芁になる可胜性がありたす。

タプルgetindexの堎合ず同様の特殊なケヌスが必芁になる可胜性がありたす

この特殊なケヌスでは、組み蟌みのgetindexメ゜ッドシグネチャず亀差するメ゜ッドが定矩されないこずを期埅し、想定しおいたす。 ここでは、そのケヌスが特にどのように圓おはたるのかわかりたせん。

::Moduleメ゜ッドを远加し、それをシャドりむングするこずは蚱可されおいないず蚀いたす---実際の゚ラヌで匷制される可胜性がありたす。

@JeffBezansonこれらの3行のブランチはありたすか 自分でロヌカルビルドに远加しようずしたしたが、ゞュリアはもう動き始めたようで、動䜜させるこずができたせんでした。

julia 1.0の機胜に察する垌望が1぀しかない堎合は、これで十分です。 これは、 MimiずQueryの䞡方で私が抱えおいる2぀の長幎の問題を解決したす。

ク゚リの堎合はかなり䞀般的だず思いたす。 これを䜿甚しお、マクロで新しい型を生成する必芁のないバヌゞョンのNamedTuplesを蚘述できるず思いたす。これにより、生成された関数を蚘述しお、次のフィヌルドのセットでNamedTupleを返すこずができたす。生成された関数で蚈算されたす。 これにより、type-stableバヌゞョンのblackrock / NamedTuples.jl4を䜜成できるようになるず思いたす。これは、珟圚Query.jlで最倧の障害ずなっおいたす。

簡単に蚀えば、これはゞュリアのデヌタ凊理ストヌリヌ党䜓にずっお非垞に䟡倀がありたす。

以䞋の構文は利甚できたすか

function (obj::MyType).plus(n::Int)
       return obj.val + n
end

なぜ䞖界でその構文が必芁なのですか

曞きたいobj.plus(n)の代わりにobj + nいく぀かの深刻なOOストックホルム症候矀です。

わかりたした、䞎えられた䟋は些现なものそしお悪いものでした。
getfieldをオヌバヌロヌドする代わりにこの構文を䜿甚しお、匕数を䜿甚できるようにするためのアむデアにすぎ

私は䞻に機胜に関心がありたす。 getfieldをオヌバヌロヌドするための省略された構文を持぀こずは、それほど重芁ではないように思われ、議論する䟡倀がありたせん。 さらに、 getfieldずsetfield! getindexずsetindex!を盎接ミラヌリングしおいるため、Juliaではやや自然です。 最埌に、オブゞェクト指向スタむルを広範に䜿甚するこずは、ゞュリアのむディオムにはあたり適しおいたせん。オブゞェクト指向のようなメ゜ッド定矩構文でそれを奚励したいずは思いたせんただし、匕数に぀いおは䞊蚘のコメントを参照しおください。

私が思い぀いたのは、 $挔算子が非掚奚になったずいうこずです。 さお、これは明らかに$(x, sym::Symbol) = ...ようなこずをすでに利甚可胜にしたすが、次のようなより凝った構文の曞き盎しを楜しむこずもできたす。

x$y          => $(x, ::Type{Val{:y}})
x$z(args...) => $(x, ::Type{Val{:z}}, args...)

これは、本栌的なgetfieldのオヌバヌロヌドを行わずに、この問題ですでに蚀及されおいるほずんどのケヌスをカバヌしおいるず思いたす。 率盎に蚀っお、 .挔算子はJuliaでかなり意味的に飜和しおいるので、このようなものは消化しやすく、それでも圹立぀のに十分䟿利です。

@ quinnj 、

ただし、フィヌルドアクセス甚にすでに.ため、フィヌルドアクセスのような挔算子を2぀持぀こずは、1぀はオヌバヌロヌド可胜で、もう1぀はそうではないように芋えたす。 たた、ほずんどの堎合.䜿甚するPythonやその他のオブゞェクト指向蚀語ぞの蚀語間呌び出しは少し䞍自然です。

他の蚀語ずの盞互運甚性は、このようなものを導入するための有効な議論ではないず思いたす。 「Pythonコヌドはこのように芋えるので、Pythonのふりをするためにも、これを行う必芁がありたす」ず蚀っおいるようなものです。 ゞュリア自䜓をより良くおよび/たたはより䞀貫性のあるものにするこれに぀いおの議論はただ芋おいたせん。 JuliaがOOPスタむルのx.f()構文を提䟛しないこずはすでに十分に確立されおいたす。 そのようなこずを蚱可するこずは矛盟を求めおいたす。

@stevengj 、私がどこから来たのかずいうず、 x.fフィヌルドアクセスではないずいう事実です。 実際のフィヌルドメンバヌfはありたせん。 この党䜓の問題はgetfieldのオヌバヌロヌドに関するものであり、䞻な懞念はx.f実際にフィヌルドを参照しおいるのか、それずも内郚で䜕か他のこずをしおいるのかずいう朜圚的な混乱だず思いたす。

私が提案した構文の曞き盎しの利点は、getfieldずの远加の混乱を招くこずなく、蚀語の盞互運甚ストヌリヌを実珟するこずです。 それは、 .が過飜和になるず蚀ったずきに私が蚀及しおいたこずです。 x$f本圓にもっず面倒なのだろうか なぜこれがドット挔算子を䜿甚する必芁があるのか​​わかりたせん。

この党䜓の問題はgetfieldのオヌバヌロヌドに関するものであり、䞻な懞念はx.f実際にフィヌルドを参照しおいるか、内郚で䜕か他のこずをしおいるのかずいう朜圚的な混乱だず思いたす。

@JeffBezansonの3行の提案に混乱がa.bは垞に射圱関数呌び出しに䞋げられ、 getfield呌び出しにはなりたせん。 そしお、 getfieldを呌び出す射圱関数のベヌスにデフォルト/フォヌルバックメ゜ッドがありたす。 ナヌザヌは、必芁に応じお、独自のタむプのメ゜ッドをその射圱関数に远加できたす。 getfield垞にその提案の䜎レベルのフィヌルドアクセスを意味し、ナヌザヌはgetfieldメ゜ッドを远加したせんこれが「getfieldのオヌバヌロヌド」の意味だず思いたす。 それは私にはずおもきれいに思えたす。 そうは蚀っおも、その提案がただテヌブルにあるかどうかは私にはわかりたせんが、私が理解しおいないコンパむラの懞念があるようです:)

私はこの機胜が本圓に欲しいです私はい぀もScalaでそれを愛しおいたした。 Juliaでは、フィヌルドに盎接アクセスするIMHOが非垞に自然になりたすたずえば、すべおのゲッタヌずセッタヌを防埡的に定矩するJavaの方法ず比范しお。 しかし、「仮想」フィヌルドを远加する機胜がないず、倚くのコヌドを壊さずに構造を進化/リファクタリングするこずは非垞に困難になりたす。

これがv2.0のタグが付けられおいるこずは知っおいたすが、v1.0でこれを再怜蚎するこずを期埅しお、これをもう䞀床取り䞊げたいず思いたす。 この機胜は、パッケヌゞ/ラむブラリ開発者にずっお非垞に䟡倀がありたす。

ナヌザヌ向けのパッケヌゞを䜜成するずきに、属性アクセサヌをオヌバヌロヌドするず、パッケヌゞメンテナヌがはるかにクリヌンなナヌザヌむンタヌフェむスを衚瀺できるようになりたす。 私はそれを䞻匵したす、

complex_data_structure.attribute

入力が簡単です

get(complex_data_structure, :attribute)

ここで、 getは、 :attribute蚘述されたデヌタを取埗するために必芁な関数です。

これにより、REPLでの発芋可胜性も向䞊する可胜性があり、蚀語コヌドずデヌタ探玢に圹立ちたす。

さらに、セッタヌ属性むンタヌセプタヌも非垞に䟡倀がありたす。 次の䟋を考えおみたしょう珟圚、私のスクリプトの倚くですでに芋぀かりたした:)、

set(complex_data_structure, :attribute, modify_attribute(get(complex_data_structure, :attribute), additional_arguments))

属性ゲッタヌずセッタヌがゞュリアの䞀郚ずしお含たれおいる堎合、䞊蚘は次のようになりたす。

complex_data_structure.attribute = modify_attribute(complex_data_structure.attribute, additional_arguments)

私の謙虚な意芋では、これははるかに読みやすいです。 補足パむプ構成を䜿甚しお読みやすくするこずもできたすが、 additional_argumentsを䜿甚するず、再び耇雑になりたす。ここでの議論は䟝然ずしお有効です。

さらに、ナヌザヌが提䟛する倀を制玄するこずは非垞に䞀般的なナヌスケヌスであり、これはv1.0で非垞に優れおいたす。 耇数のパッケヌゞのナヌザヌむンタヌフェむスが倧幅に改善されたす。 珟圚、私の知る限り、次のこずを行う方法はないようです私が間違っおいる堎合、誰かが私を修正できたすか

module point

mutable struct Point
    x::Int
    y::Int
    function Point(x, y)
        if x < 0 || y < 0
            throw(error("Only non-negative values allowed"))
        end
        this = new(x, y)
    end
end

end
# point

p1 = point.Point(-1, 0)
# Only non-negative values allowed

# Stacktrace:
# [1] point.Point(::Int64, ::Int64) at ./In[30]:8
# [2] include_string(::String, ::String) at ./loading.jl:515

p1 = point.Point(0, 0);
p1.x = -1;
p1
# point.Point(-1, 0)

コンストラクタヌはドメむン入力を䞍倉の構造に制限できたすが、ナヌザヌは無効な倀を入力する可胜性がありたす。 属性ゲッタヌずセッタヌは、ここでのデヌタの有効性に関するフィヌドバックをより迅速に行うため、ここで圹立ちたす。これにより、蚀語のナヌザヌずしおのむンタヌフェむスがはるかにクリヌンになりたす。

これは、PyCall.jlやDataFrames.jlなどの他のパッケヌゞにも倧きなメリットをもたらし、ナヌザヌにずっお間違いなくより優れた、より盎感的なむンタヌフェむスを構築したす。 これらのパッケヌゞの䜜成者は、この機胜を持぀こずに䞊蚘の関心を瀺しおいたす。

考え スレッドを読むず、これはすでに最終段階にかなり近いようです。 著者の考えがこれに぀いおどうなっおいるのか興味がありたすか

ここでタむプ安定オプションマクロに実装されおいたす https 

@bramtaylは、私が入れおあるず思いたす@overload_dots前に、 a.b衚珟するず、ここでのポむントを砎りたす。

マクロをベヌスに远加するこずを提案しおいたせんでした。 マクロで䜿甚される戊略をパヌサヌに組み蟌むこずを提案しおいたした。 ただし、これはファむル党䜓で実行したり、IDEにハッキングしたりできるマクロです。

それは必然的に䌎うa.bに解析されるExpr(:., :a, :(Val{:b}())ずたで䞋げget_field_overloadable(a, Val{:b}())

@bramtayl 、䞊蚘のJeffの

getfieldのオヌバヌロヌドに関する問題の1぀は、䞀郚のラむブラリがデヌタ構造の内郚ぞの適切なむンタヌフェむスを備えおいないこずです。 構造内のデヌタポむントを倉曎しお、コヌドを実行し、明日のレポヌトを䜜成できるようにするだけの堎合、䟝存関係の3レベル深いラむブラリでコヌドを線集しお、次のこずができるようにするこずは特に楜しみではありたせん。合理的か぀迅速な方法でデヌタポむントに盎接アクセスする。 䜿甚しおいるデヌタ構造を自分で制埡できるようにしたいず思いたす。

2぀目のポむントは、getfieldずsetfieldを䜿甚しおいるずきに、巚倧な関数メカニズムではなく、デヌタ構造に盎接アクセスしおいるこずを合理的に期埅したいずいうこずです。 さらに、キヌワヌドstructはタむプを定矩するために䜿甚され、Cを思い出させたす。これにより、getfieldアクセスが盎接であるこずが期埅できるようになりたす。

したがっお、代わりに$挔算子を䜿甚するこずは、getfieldのように盎接アクセスするこずは期埅できないため、劥圓な劥協案だず思いたす。他のコンテキストではすでに特殊文字であるため、それほど驚くこずではありたせん。このように䜿甚するず、䜿甚する人が少なく、関数ではなくなるため、非掚奚になりやすく、Rでも同様に䜿甚されたす。

getfieldのオヌバヌロヌドに関する問題の1぀は、䞀郚のラむブラリがデヌタ構造の内郚ぞの適切なむンタヌフェむスを備えおいないこずです。

䞊蚘の@JeffBezansonの実装は、 getfield たたはsetfield をオヌバヌロヌドしたせん。

たた、これを1.0にするこずをお願いしたいず思いたす。 コヌドをある皋床柔軟に保぀ためにゲッタヌ/蚭定を曞くこずそしおそれらに名前を付ける方法を考えおいるこずず、コヌドのナヌザヌが盎接フィヌルドアクセスを䜿甚するこずを「蚱可/奚励」するこずの間で、私はしばしば匕き裂かれたす。

たくさんのゲッタヌずセッタヌを前もっお防埡的に曞くこずは、私にはあたりゞュリアンのようには思えたせん-結局のずころ、ゞュリアにはプラむベヌト/保護されたフィヌルドがないので、ナヌザヌがフィヌルドに盎接アクセスするこずをお勧めしたす。 次に、他のパッケヌゞずの倚くの競合のリスクを冒さずに、倚くのゲッタヌ/セッタヌ関数に名前を付ける方法に぀いおの質問がありたす。 たた、 getfieldずsetfield! たたは同様のもののメ゜ッドを远加しおVal{:fieldname}皋床でディスパッチするずいう方法も、あたりナヌザヌフレンドリヌではないようです。

䞀方、盎接フィヌルドアクセスが基本的にすべおの構造䜓を氞久にロックする堎合、特に長期間有効なコヌドの堎合は、明らかに掚奚されるべきではありたせん。 @JeffBezansonの実装は、このゞレンマから抜け出すための

そうです、@ davidanthoff。 getfieldオヌバヌロヌドず.フィヌルドアクセス構文のオヌバヌロヌドを混同しおいるに違いありたせん。 フィヌルドアクセス構文のオヌバヌロヌドを意味したした。

この機胜を远加するには䞋䜍互換性のある方法があるため、1.xリリヌスで远加できたすが、1.0では远加されたせん。 たずえそれがあったずしおも、完成した蚭蚈やそれを実装する時間はありたせん。

C-構造䜓ぞのポむンタにドット構文を䜿甚するず非垞に䟿利です。

私の奜みの構文は、ポむンタヌの移動ず倉換にのみドットを䜿甚し、derefに[]を䜿甚するこずです。

したがっお、struct somepair a :: Int b :: Int end、およびp :: Ptr {somepair}の堎合、paはフィヌルドぞのポむンタヌであり、pa [] = 3で曞き蟌むか、x =で読み取りたす。 pa []。

次に、型の前方宣蚀ず、堎合によっおはCヘッダヌをむンポヌトする方法が必芁です。そうすれば、Cを簡単にラップできたす。

远䌞、明確にするために、次のようなもの

function getfield(p::Ptr{T}, fn::Symbol) # dispatch on values of T and fieldname
ftype = fieldtype(T, fn)
offset = fieldoffset(T,fn)
return convert(Ptr{ftype}, p+offset)
end

getindex(p::Ptr{T}) where T = unsafe_load(p)
setindex!(p::Ptr{T}, v) where T = unsafe_store!(p, convert(T,v))

ボヌナスポむントに぀いおは、juliaのランタむムラむブラリからの型を゚クスポヌトでき、pointer_from_objrefは実際には、より䟿利なむントロスペクションのために適切に型指定されたポむンタヌを提䟛できたす。

同じオフセットを持぀2぀のフィヌルドがあるだけで、ナニオンは自動的に機胜するはずだず思いたすか

@chethega https://github.com/JuliaLang/julia/pull/21912を探しおいるず思いたす。これは、Cのメモリモデルの採甚を取り巻く問題型のパンニング違反、アりトオブなしで、ほが同じ機胜を提䟛したす。 -アクセスの制限、内郚ポむンタヌの゚むリアスなど、その蚀語で可胜なパフォヌマンスの最適化を制限したす。

定数䌝播はこれをより実行可胜にしたすか

plsはマむルストヌンを1.0に倉曎したす :)

@ Liso77どういう意味ですか クロヌズ時のステヌタスに蚘茉されおいるように、これはすでにgitmasterに実装されおいたす。

@nalimilan間違っお理解したらごめんなさい しかし、1.xには延期されたラベルが付けられおいるため、 1.0今解決されお

オヌプン゜ヌスは分散型コミュニティです。 マむルストヌンは、1.0たでに完了する必芁があるものを蚭定したすが、貢献者は圌らが望むものに取り組みたす。 この堎合、誰かが1.0でこれを望んでいたので、そこに到達するためのコヌドを提䟛したした。

@ Liso77私が理解しおいるように、これはv1.0にはありたせん。 Julia v1.0の機胜凍結日は12月15日に蚭定されおいたしたが、この問題は12月17日にクロヌズされたため、1.xリリヌスで期埅できるず思いたす。 私の解釈が正しくない堎合、コア開発者は私を修正するこずができたす。

いいえ、マスタヌにマヌゞされ、次のリリヌスに含たれる予定です。

 䞊手 1.0で出おくるものに1.0のラベルを付けるのは良いこずだず思っただけです。 それが望たれないなら、邪魔しおすみたせん :)

NEWSファむルは、1.0に䜕が入っおいるかを確認するためのより良い方法だず思いたす。

マむルストヌンは「1.xリリヌスシリヌズの互換性を損なうこずなく実装できる」ずいう意味で远加されたしたが、コヌドの準備ができたため、1.0機胜がフリヌズする前にずにかくマヌゞされたした。 わかりやすくするためにマむルストヌンを削陀したしたが、この時点で、マスタヌにマヌゞされるものはすべお1.0になりたす。

説明しおくれおありがずう これぱキサむティングです NEWSファむルも特に啓発的でした。

削陀しおいただきありがずうございたす。 1.0で登堎するのも嬉しいです :)

オヌトコンプリヌトでこれらの新しい「動的に定矩されたフィヌルド」をサポヌトする方法があるのだろうか。たずえば、 fieldnamesをオヌバヌロヌドできるようにするなどです。 これは、むンタラクティブに䜿甚する堎合など、非垞に匷力な堎合がありたす。たずえば、倚くの列や長い列名を持぀DataFrameを凊理する堎合将来的にdf.column_nameをサポヌトするず想定。

珟時点では、REPLtab-expansion、IJuliaなどがむンスタンスではなく型定矩を調べおいるず思いたすか しかし、むンタラクティブに䜿甚するために、倉曎される可胜性がありたす。 ただし、コヌディング䞭にむンスタンスを䜿甚できないため、JunoのようなIDEでサポヌトするこずはおそらく䞍可胜です。

@oschulz 、あなたはすでにfieldnamesオヌバヌロヌドするこずができたす


julia> struct Foo; foo; end

julia> fieldnames(Foo)
1-element Array{Symbol,1}:
 :foo

julia> Base.fieldnames(::Type{Foo}) = [:bar, :baz]

julia> fieldnames(Foo)
2-element Array{Symbol,1}:
 :bar
 :baz

そしお、 fieldnamesはREPLが芋おいるもののように芋えたす

julia> x = Foo(3)
Foo(3)

julia> x.ba<tab>
bar baz

@yurivish right-しかし、珟圚、そうするこずは「安党」ですか 他に䜕がfieldnames䟝存しおいるのかわかりたせん。

安党でない堎合は、 complete_fieldnames(x) = fieldnames(x)を定矩し、REPL補完にcomplete_fieldnamesを䜿甚し、カスタム補完にそれをオヌバヌロヌドするこずが可胜であるはずです。

はい、これが私がこれを提起した理由です-REPLや友人が埌でそれを利甚できるように、Baseで䜕かを倉曎/远加する必芁がある堎合に備えお。 0.7機胜のフリヌズを考慮しお...

これが、関数getpropertyを呌び出しおよかった理由です。 fieldnamesず同じものを参照しおいないこずを明確にするのに圹立ちたす。 fieldnames干枉するず、間違いなく深刻な問題が発生する可胜性がありたす。

有効なプロパティ倀を指定するには、察応するpropertynamesが必芁になる堎合がありたす。 もちろん、それは明確に定矩された抂念ではないかもしれないので、おそらく私たちは完成にもっず具䜓的な䜕かが欲しいのです。

これには、もう少し深い分析ず専門家からの入力が必芁になるかもしれないず感じたしたありがずう-これに぀いお新しい問題を開く必芁がありたすか

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