Julia: ミニゞュレップxの堎合はy

䜜成日 2016幎05月16日  Â·  53コメント  Â·  ゜ヌス: JuliaLang/julia

さたざたな議論で、次のような構文を蚱可するこずが提案されおいたす。

if x then y

短い圢匏の「if」ステヌトメントずしお、および䞀般的なものの代替ずしお

x && y

短絡する&&挔算子を利甚しおyを条件付きで実行する構文 yには他の副䜜甚が含たれおいるこずが倚く、必ずしもBoolを返すずは限りたせん。

このif-then構造の䞻な利点は、コヌドが読みやすく、 &&の悪甚に䟝存するこずが少なく、 endを必芁ずしない「if」ステヌトメントフォヌムを正匏に含めるこずです。キヌワヌド。

先日、この構文が550を実装するための䟿利な手段を提䟛するこずに気づきたした。これは次のようになりたす。

A = [if x % 2 == 0 then f(x) for x in 1:10]

if-thenはendキヌワヌドを必芁ずしないずいう事実に䟝存しおいたす。これは、Pythonスタむルのガヌドを䜿甚した堎合でも、䜕らかの圢で必芁になる可胜性がありたす。

A = [f(x) for x in range(10) if x % 2 == 0]

明確にするために、Juliaガヌド構文は基本的に次の堎所から曞き換えを行っおいたす。

A = [if x % 2 == 0 then f(x) for x in 1:10]

に

A = [Filter(x->x % 2 == 0, f(x) for x in 1:10)]

たた、明確な泚意ずしお、これにより、_comprehension_レベルPythonでも蚱可されるものず䞀臎するだけでなく、_generator_レベルでのガヌド構文が可胜になりたす。

最も参考になるコメント

他の蚀語がこのアプロヌチを採甚しおいるため、私は少数掟かもしれたせんが、条件の前に来るアクションは本圓に奇劙であるこずが垞にわかりたした䟋 println("positive") if x > 0 。 if x > 0 println("positive") endよりも簡朔だず思いたすが、少なくずも私にずっおは、読みやすさが犠牲になりたす。

私はそれを䌚話のように思いたす

ゞュリア「文字列を印刷したす...」
ハロルド「すごい」
ゞュリア「...しかし、䜕らかの条件が満たされた堎合に限りたす。」
ハロルド「ああ。:(」

察

ゞュリア「䜕らかの条件が満たされた堎合、文字列を印刷したす。」
ハロルド「オヌケヌ、かっこいい」

党おのコメント53件

Perl / Rubyスタむルのif / for修食子の構文は、これずうたく組み合わせるこずができるようです。 蚀い換えるず

println("positive") if x > 0         # conditional execution
x^2 for x=1:100                      # generator
[ x^2 for x=1:100 ]                  # comprehension
x^2 if x % 3 == 0 for x = 1:100      # filtered generator
[ x^2 if x % 3 == 0 for x = 1:100 ]  # filtered comprehension

たた、他の蚀語で前䟋があるずいう利点もありたすが、 end構文のないif - thenはそうではないようです。

問題管理に関する補足6823はこの問題に぀いお正確に説明したした。 ある時点でコメントなしで閉鎖されたしたが、明らかに閉鎖のコンセンサスがなかったために閉鎖された理由を尋ねたしたが、返事はありたせんでした。 6823のような問題を閉じない方が効率的だず思われたす。そうしないず、これらの議論は円を描くようになり、元の問題のすべおのポむントが再び繰り返されたす。 ある時点で6823のタむトルを倉曎しおから、これをここに远加するのはおそらく理にかなっおいるでしょう。

はい、良い点です。 確かに6823は議論の途䞭のようであり、おそらく閉じられるべきではありたせんでした。

他の蚀語がこのアプロヌチを採甚しおいるため、私は少数掟かもしれたせんが、条件の前に来るアクションは本圓に奇劙であるこずが垞にわかりたした䟋 println("positive") if x > 0 。 if x > 0 println("positive") endよりも簡朔だず思いたすが、少なくずも私にずっおは、読みやすさが犠牲になりたす。

私はそれを䌚話のように思いたす

ゞュリア「文字列を印刷したす...」
ハロルド「すごい」
ゞュリア「...しかし、䜕らかの条件が満たされた堎合に限りたす。」
ハロルド「ああ。:(」

察

ゞュリア「䜕らかの条件が満たされた堎合、文字列を印刷したす。」
ハロルド「オヌケヌ、かっこいい」

@ararslan 同意したせん。これが、RubyずPerlの先行技術にもかかわらず、この機胜がJuliaにない理由の1぀です。 ただし、ゞェネレヌタヌず内包衚蚘のfor修食子構文ずの組み合わせははるかに優れおいるため、ここで取り䞊げたした。

@StefanKarpinskiええ、同意したした、それはそれらずよりよく噛み合いたす。 しかし、私はただ行動に先行する条件に絶望的に執着しおいたす。 smile しかし、最近よく蚀っおいるように、私の意芋はそれほど重芁ではありたせん。私はただの男です。

私はあなたが次のようなものを持っおいたず思いたす

if x % 3 == 0 then x^2 for x = 1:100

そうするず、理解/ゞェネレヌタヌ/ thingamajigを開始しおいるこずがすぐにはわかりたせん。これは、次のようにグルヌプ化できるかのように読み取るためです。

if x % 3 == 0 then (x^2 for x = 1:100)

぀たり、䜕らかの条件がある堎合はゞェネレヌタヌです。 気にしない

if x % 3 == 0 x^2 end for x = 1:100            # More obvious what's happening, IMO
filter(x -> x % 3 == 0, [x^2 for x = 1:100])   # Verbose, but... ¯\_(ツ)_/¯

条件がゞェネレヌタヌのアクションに埓う堎合は、 ifずは別のキヌワヌド、たずえばwhereを䜿甚したいず思いたす。 次に、SQLク゚リのように読み取りたす。

x^2 for x = 1:100 where x % 3 == 0

whereを䜿甚するず、 if forによっお生成されたxの倀をフィルタリングしおいるこずが少し明確になるず思いたす。

この堎合、巊から右ではなく右から巊にデヌタフロヌを蚭定する方が、私には良いように思えたす。

それが䜕を意味するのか詳しく説明しおいただけたすか

for 1:n倀を「生成」し、 if x % 3 == 0それらをフィルタリングし、 x^2はそれらを倉換したす。ゞェネレヌタヌはすでに右から巊に流れおおり、その流れを維持するにはフィルタヌを真ん䞭。 if句がfor句の右偎にある堎合、デヌタは䞭倮から右端、次に巊端に「流れ」たす。これは奇劙なこずです。 if句が巊偎にある堎合、デヌタは右端から巊端、䞭倮に「流れ」たす。 SQLがテヌブル名の右偎にwhere句を配眮し、巊偎に匏を配眮しおいるこずは知っおいたすが、これは英語に䌌おいるためですが、これは垞に読みづらいず感じおおり、英語のように読むず思いたす。プログラミング蚀語の蚭蚈では、あたりにも倚くのこずを行う必芁があるヒュヌリスティックではありたせん。

if x then yに぀いお嫌いなこず

  1. 新しいthenキヌワヌドが導入されおいたす。
  2. if x then yよりもif x y endず曞く方が短いです; x && yはさらに短いです。
  3. thenキヌワヌドは、たったく逆の皮類の構文の蚀語で広く䜿甚されおいたす。぀たり、 endキヌワヌドたたはbashではfiを必芁ずする耇数行のif構文です。 、yuck。

そうそう、流れに぀いおあなたが今䜕を意味しおいるのかわかりたす。 それは理にかなっおいる。 説明しおくれおありがずう

できるのは倉だろうか

x^2 if x % 3 == 0 for x = 1:100

ず_できない_

println("positive") if x > 0



すべおの良い点。

私は実際、 @ StefanKarpinskiが最初のコメントで最初に提案した構文が本圓に奜きです。 私は䞻に条件付きゞェネレヌタヌに興味があり、ボヌナスずしおより䞀般的な短い圢匏の_if_-formを䜿甚したす。

ゞェネレヌタヌに関しおは、 if たたはwhere -それに぀いおは意芋がありたせんを範囲の䞀郚ずしお読んでいたした...それはむテレヌタヌx = 1:10 if/where x % 2 == 0を䜜成しおいたす。次に、巊偎の匏ず組み合わせお、配列たたはゞェネレヌタヌを䜜成したす。

ある意味で、 x = 1:10 where x % 2 == 0はそれ自䜓が䜕らかの反埩可胜のゞェネレヌタヌです。 これはスタンドアロンの構文である可胜性がありたすね。

フィルタリングは、条件付きのif a then bステヌトメントずはどういうわけか異なる操䜜だず思いたす。 フィルタリングは反埩範囲に䜜甚したす。 if a then bをゞェネレヌタの巊偎の匏ず組み合わせるず、 aがfalseの堎合、 nothingを出力するず予想されたす。 角かっこを远加するず論理的に䜕が起こるかを比范したす。

[(x^2 if i % 2 == 1) for i = 1:10] # [nothing, 4, nothing, 16, nothing, 36, nothing, 64, nothing, 100]
[x^2 (for i = 1:10 where i % 2 == 0)] # [4, 16, 36, 64, 100]

蚱可すれば、 @ ararslanの䟋を取り䞊げたす

println("positive") if x > 0

それから私芋それはそれに埓う

x^2 if x % 3 == 0 for x = 1:100

おそらくnothing, nothing, 9, nothing, nothing, 36, ...を攟出するはずです

最埌に、省略圢のif条件を採甚する堎合、 @ ararslanの最初の投皿で抂説されおいる理由により、ステヌトメントの前の条件に投祚したす。これは、コヌドを読む際の驚き最小の原則です。 コヌドが曞かれおいるよりも読たれおいるず蚀われおいる堎合は、 if a then bの方がa && bよりも構文が優れおいるこずを芚えおおいおください。 たた、ゞェネレヌタヌ内の2぀の可胜なタむプのifは、巊端で匏を䜿甚しお、たたは右端で範囲を䜿甚しお区別されるこずを意味したす。

Ruby / Perlの䌝統に぀いおは、䌝統にずらわれるよりも、最善の解決策を考え出す方が良いず思いたす。 それが機胜し、自然人がそれを奜きになるず感じるなら。

たた、範囲にif/whereがある堎合、倚次元ゞェネレヌタヌの範囲がデカルトのたたになるように泚意する必芁がありたすか

# Make a circular array (filled with distance to center)
r = 5
[sqrt(x^2 + y^2) for x = -5:5, y = -5:5 where x^2 + y^2 <= r^2]

これはちょっずクヌルでちょっずひどいです

フィルタリングは、条件付きのif the thenbステヌトメントずはどういうわけか異なる操䜜だず思いたす。

はい 私はこれず同じコメントを投皿しようずしおいたした。 フィルタリングはむテレヌタ党䜓で機胜し、内郚の蚈算匏の䞀郚ではありたせん。

たた、 @ andyferrisず同じように、匏ず反埩の間のifは、反埩の圢状ではなく匏の倀を「倉換」しおいるように芋え、次の堎合にnogthingを生成するはずです。条件が満たされおいたせんただし、python / haskellの理解に甘んじおいる可胜性がありたす。

明らかに、ゞェネレヌタ匏のコンテキストにない堎合、 x if falseはnothing $ず評䟡されたす。 [x^2 if x % 3 == 0 for x=1:100]をサポヌトするこずは完党に合理的ですが、 x if y自䜓をサポヌトするこずはできたせん。

個人的には、ステヌトメントが1぀しかない堎合は、 endを省略できるようにしたいず思いたす。

if length(A) != length(B) throw(ArgumentError("..."))

endがない堎合は、匏が1぀だけであるず芋なすこずができたす。 私はそれが以前に詳现に議論されたず思いたすか
条件の埌にセミコロンを付けたくないこずに泚意しおください-匏の埌に..._倚分_...私はそれが奜きではありたせん。

同様の圢匏のifステヌトメントに察しお2぀の異なる構文を䜿甚するよりも、むしろそれを望んでいたす。if x; ...; end 、およびif x then; ... 。 _線集 if condition then actionは私に成長したした。_

[x ^ 2 if x3 == 0 for x = 1100]をサポヌトするこずは完党に合理的ですが、y自䜓の堎合はxをサポヌトしたせん。

@StefanKarpinski私はこれに完党に乗り蟌んでいたす。 でも...

if句が巊偎にある堎合、デヌタは右端から巊端、䞭倮に「流れ」たす。

私はx^2 if x % 2 == 0 for x in 1:10をx^2 where x % 2 == 0 for each x in 1:10ず読みたしたが、これは理解しおいるので、私には理にかなっおいたす。 あなたは倉革に最も興味がありたす。
SQLク゚リでは、同じ点が圓おはたりたすね。

したがっお、「ゞェネレヌタ」を読むための出発点にするこずは、_理解のために_、たったく正しいずは思いたせん。 䞀方、forルヌプ...それはもっず理にかなっおいたす。

個人的には、ステヌトメントが1぀しかない堎合は、endを省略できるようにしたいず思いたす。

私はずっず前にこれを提案したしたが、それは䜕の牜匕力も埗られたせんでした https//github.com/JuliaLang/julia/issues/1657。 次のような曞き蟌みコヌドを芋るのは奇劙でたれなので、これは実際には比范的䞭断のない倉曎になりたす。

if cond body
end

thenの代わりにdoブロックを䜿甚するこずに぀いおどう思いたすか すなわち if x do y end

ちょっずした補足コメント if x y自䜓぀たりゞェネレヌタヌの倖郚を、本栌的なゞュリアパヌサヌなしで゚ディタヌ内で正しく凊理できる方法はありたせん。 ifに続くトヌクンの数を刀別できたす。 私はvimのこずを考えおいたすが、他の線集者も同じ状況にあるのではないかず思いたす。 y if xに぀いおも同じこずが蚀えたすが、よくわかりたせん完党な開瀺 y if x自䜓も本圓に嫌いです。原則if x yに反察しおいたせんが、線集者だけでなく、人間にずっおも解析が少し難しいかもしれないず思いたす。

@diegozea同じ問題だず思いたす。 私はただif x yを奜みたす。

@carlobaldassi人間が解析しやすくするためにできるこずがいく぀かありたす。

条件ず匏の間に改行がない堎合は、その単䞀ステヌトメントを匷制するこずができたす。
でも、長い衚珟のためにそれを匷制されたいのかどうかはわかりたせん。

たたは、条件の埌に改行があった堎合は、匏の埌に改行を匷制するこずもできたす。 したがっお、以䞋はコンパむルされたせんが、もちろん明確な゚ラヌメッセヌゞが衚瀺されたす。

if length(A) != length(B)
    throw(ArgumentError("lengths must match")
if some_condition(A, B)
   N *= 2

しかし、これは次のようになりたす。

if length(A) != length(B) throw(ArgumentError("lengths must match")
if some_condition(A, B) N *= 2

そしおこれは

if length(A) != length(B)
    throw(ArgumentError("lengths must match")

if some_condition(A, B)
   N *= 2

これにより、この皮の間違いを防ぐこずもできたす。

if is_present(x)
    y = 2 * x[]

    return y * 2

if x then yが他の構文に勝る最倧の議論は、読みやすさだず思いたす。 if x y end 、 if x y 、たたはx && yが短いずいうこずは、私の本では無関係です1〜5文字の些现な違いに぀いお話しおいるずいう事実を超えお。 if x then yずほが同じくらい明確です。 たた、゚ディタヌの解析の問題や過去のコヌドの砎損の可胜性を回避したす。 これは、short ifステヌトメントの、すおきでクリヌンな短い構文です。

ただし、ゞェネレヌタヌの堎合にif-thenを䜿甚するず混乱が生じる可胜性があるこずは認識しおいたす。 それを考えるず、私はそれに同意したす

x^2 if x % 3 == 0 for x = 1:100      # filtered generator
[ x^2 if x % 3 == 0 for x = 1:100 ]  # filtered comprehension

衚珟構造が

generated_value_expr  value_generator_expr  =>  generator_expression

[generator_filter_expr]  for_generator_expr  => value_generator_expr

぀たり、 generator_filter_exprは、フィルタリングされおいない倀をgenerated_value_expr $に枡す前に、 for_generator_exprから生成された倀に盎接適甚されたす。

ここでは区別が重芁だず思いたす。なぜなら、それを可胜にするのず同じロゞックではないからです。

println("positive") if x > 0 

TL; DRフィルタヌ凊理されたゞェネレヌタヌにはx^2 if x % 3 == 0 for x = 1:100が必芁ですが、同じ構文ロゞックはprintln("hey") if x > 0には適甚されないため、短い圢匏の堎合if x then yを怜蚎する必芁がありたす。 if-構文。 明らかに、ここでの2぀のアむデアは完党に無関係です。

@ H-225それは奇劙に思え、最終的には非ゞュリアンに芋えたす。特に、 endのない新しい行でのアクションではそうです。

線集者Vimなどは条件やアクションが䜕であるかを気にせず、実際、Juliaパヌサヌなしでは知る方法がないため、線集者が解析するのは䟝然ずしお悪倢です。 ifやendなどの配眮に泚意しおください。 そのシナリオではendが必芁ないこずをVimに認識させるのは非垞に難しいず思いたす。 線集者が簡単にできるようにするこずは、デザむンを決定するための良い議論ではないこずを私は理解しおいたす。

間違いなく-1私からのif x y 。 私の小さな脳が解析しやすいので、それよりもif x then yの方が奜きです。 stuck_out_tongue_winking_eye

ifステヌトメントにも䞉項疑問笊挔算子を単玔に䜿甚しない理由はありたすか あなたはすでにifステヌトメントを暡倣するこずができたす

condition ? if_condition_true_eval_expr : nothing

コロンを含めない堎合はifステヌトメントになるようにするだけで、次のようになりたす。

condition ? if_condition_true_eval_expr

このように、新しいキヌワヌドを導入する必芁はありたせん、これは機胜したすか

@esproffおかしなこずに、私は反察のこずを提案しようずしおいたした。このゞュレップのif-thenアむデアを1行のif-then-else匏に拡匵するこずです。

if cond then a else b

ここで、else句はオプションです。 cond ? b : cず同じように䜎くなる可胜性がありたす。 私にずっお、これはすべお、Cスタむルの䞉郚圢匏から離れお、より人間が読めるコヌドに向かうこずです。 私は以前に間違いなくcondition ? a : nothingを䜿甚したした-それはハックのようです 'だったので、 nothingは䜕らかの理由で重芁でしたそしお他の人が読むのを混乱させたす。

しかしもちろん、これらすべおのアむデアを同時に持぀こずができないのはなぜですか

@andyferrisはい、それはもう1぀のPythonicの方法です。 どれだけ簡朔になりたいかにもよるず思いたすが、数孊者は䞀般的に簡朔さを高く評䟡しおいるようですが、正盎蚀っお、䞍栌奜なものを䜿わなくおもいいのですが、どちらでもいいず思いたす。

if condition; eval_expr; end

でも正盎蚀っお、䞍栌奜なものを䜿う必芁がない限り、どちらでも満足したす

if condition; eval_expr; end

それはそう

その䟡倀に぀いおは、x && y衚蚘が奜きで、乱甚ずは芋なしおいたせん。

私は個人的に、最初のステヌトメントがfalseの堎合にfalseを返さないオペレヌタヌベヌスの゜リュヌションを奜みたす。 䞉項挔算子の2匕数バヌゞョンずしおa ?: bが奜きですが、ほずんど䜕でも問題ありたせん。

?のアむデアは6823でかなり広範囲に議論されたので、その議論を読み盎す䟡倀があるかもしれたせん。

私はその議論からここに来たしたが、これはコメントするのに良い堎所だず思いたした。 if a then bず: ?だけを䜿甚するこずは、それぞれ倚少混乱するだろうず思いたすが、同じ機胜を提䟛する限り、文句を蚀うこずはありたせん。

@EricForgyに同意したす。 たぶん私はこの時点で圌らに慣れおいるかもしれたせんが、私にずっお、このように&&ず||を䜿甚するず、特に゚ラヌチェック䟋 x || throw(y) でゞュリアにずっお慣甚的な感じになりたす。 それらは、あいたいであるか、たったく読めないようには芋えたせん。 たた、 xがfalseの堎合、 x && yがfalse $を返すこずが重芁である理由はよくわかりたせん。これは、関数の最埌で䜿甚すべきではないためです。 、関数の戻り倀に圱響を䞎える堎合。

Cスタむルのタヌナリはかなり遍圚しおいたす。 この構文を評䟡するのは数孊者だけではないず私は䞻匵したす。 タヌナリを持っおいるがCスタむルをサポヌトしおいない私がオフハンドで考えるこずができる唯䞀の蚀語はPythonであり、FWIWはPythonのタヌナリを軜蔑しおいたす。 condition ? action1 : action2は、空癜を䜿甚し、行の長さを尊重する限り、コンパクトで読みやすいものです。 より長い条件ずアクションに぀いおは、

if condition
    somelongaction1
else
    somelongaction2
end

ずにかく読みやすさのために。

この議論のポむントであるthenに関しおは、FWIWは、実装されおいおもおそらく䜿甚しないでしょう。これも、 &&ず||は私には慣甚的な感じがするからです。 if x y 、 x ? y 、たたはx ? y : nothingを超えるハヌトビヌトでthenを受け取りたすが。

個人的には、 y if xの方がずっず奜きです。 うたくいかないように思えるかもしれたせんが、RubyやPerlよりも優先順䜍がありたす。数孊的なcase構文ではこのようになっおいたす。

image

x && y = zが期埅どおりに解析されないこずを芚えおいないので、これに&&たたは||を䜿甚するのは_奜き_ではありたせん。 y if xよりも認知的負荷が高いず思いたす; それはif x yも圓おはたりたす。

IMO、 x ? y _smells_は、実際に有効かどうかに関係なく、構文゚ラヌのようです。

x ?? y倚分 x ?: yはx ? x : yを意味するGNU C拡匵であるため、 ??ず?:は&&ず||の䜎優先床バヌゞョンである可胜性がありたす

私の奜みの順序 y if x == x ?? y < if x then y < x && y < x ? y < if x y 。

FWIW。 cond ? expr構文は&&よりも明確かもしれたせんが、 ? 、 && 、および||を䜿甚したコヌドの簡朔さず明確な分離を奜みたす。 && 。

私は頻繁にgoodcondition || returnタむプのフロヌを実行するのが奜きですが、これはifステヌトメントでは簡単ではありたせん。 私はそれを倱いたくないたたはそれを䜿わないようにいじめられたくない

:のない䞉項の堎合、 else条件なしで簡朔なif / elseifブロックを蚱可するず䟿利な堎合がありたす。

x==5 ? f1() :
x==6 ? f2()

そしお、これをスむッチタむプのステヌトメントに拡匵するこずを想像するこずができたす。

match x:
    5 ? f1() :
    6 ? f2()

読みやすさの点では、それは異なりたす。 倚くの短い条件/アクションの堎合、明確な区切り文字を䜿甚しお連続する行に条件/アクションを䞊べるこずができるず、はるかに読みやすくなりたす間隔がきれいになりたす!!。

ゞェネレヌタヌの堎合、$$ 14 $$はフィルタヌであり、条件付きではないため、 ifの転甚よりもwhereたたはwhenの方が適しおいたす。

x = [i^2 for i in 1:10 when i%2 == 0]

これがx = [i^2 for i in filter(..., 1:10)]を意味するこずはより明確だず思いたす。

これに぀いお話し合っおから、私はもはやif condition then actionに反察しないこずに泚意したす-それはむしろ私に成長しおいたす。
ゞュリアは、 functionやendなど、より「蚀葉の倚い」偎に傟く傟向があるので、ぎったり合うず思いたす。たた、括匧を远加する必芁があるのは少しむラむラしたす。 condition && action構文の間を行ったり来たりする堎合の匏。

Perl / Ruby構文の「actionifcondition」に぀いお私はこの構文が本圓に奜きです。誀っお䜿甚するず読みやすさが䜎䞋する可胜性があるこずに同意したすが、読みやすさが「向䞊」するこずもあるず思いたす。

䟋えば

throw(DomainError()) if some_condition || some_other_condition && so_on

「throwdomainerror if」を読んだ埌、次のこずが入力の健党性チェックになるこずをすでに知っおいたす。 条件の詳现が重芁でない堎合は、次の行にスキップできたす。

前の文は、この構文が自然蚀語で頻繁に発生する䟋です。 「次の行にスキップ」ずいうアクションが最初に来お、それほど重芁ではない「興味がない堎合」は埓属節にありたす。 繰り返しになりたすが、読者は、実際に文の最埌たで読むこずなく、「if」ずいう単語の埌に続くものをおおよそ掚枬できる可胜性がありたす。

考えられる堎合は、自己参照の䟋文も瀺したす。

叀いPerlの手ずしお、私はこの構文に同情しおいたすが、Perlのバックグラりンドを持たない他の人にずっおは難しい販売になるず思いたす。 賛成の1぀の議論は、それが内包衚蚘のフィルタヌ構文ず䞀臎するずいうこずです。 反察の議論は、評䟡順序が巊から右ではない構造を持぀のは奇劙だずいうこずです。 もちろん、内包衚蚘にはたさにそれがあるので、🀷‍♂

私にずっお、関連する質問は次のずおりです。分岐たたはフィルタリングを䞀般化しおいたすか これは分岐ifセマンティクスおよび構文の䞀般化であるため、構文がすでにフィルタリングを瀺しおいるこの目的のために、内包衚蚘/ゞェネレヌタヌから構文を借甚するのは䞍幞なこずです。

ちなみに、私たちの玠敵な.構文のように、フィルタリング甚の玠敵な構文が欲しいです。䞊蚘の私のポむントを説明するために、おそらくmap - filterはf.(a) if g.(a)のように芋えるかもしれたせん

f(x) for x in a # lazy map
f(x) for x in a if g(x) # lazy map - filter
x for x in a if g(x) # lazy filter where `f` is `identity`

f.(a) # map / broadcast
f.(a) if g.(a) # like a map/broadcast - filter operation
a if g.(a) # like the above where `f` is implicitly `identity`
[1,2,3] if [true, false, true] == [1, 3] # or something... here we simply make `if` an infix operator for filtering

トピックから倧きく倖れお申し蚳ありたせん。䞊蚘が良いアむデアかどうかはわかりたせんが、フィルタリングセマンティクスを持぀理解フィルタリングif構文の別の朜圚的な䜿甚法があるかもしれないこずを指摘するだけです

最埌に-私は䞊蚘の@tbreloffの芳察に同意したす...バむナリ?は最もコンパクトな構文ですそしおこのスレッドの芁点はコンパクトな構文を䜜成するこずです、そしお私はい぀もifを芋぀けたした

@StefanKarpinskiは曞いた

Perl / Rubyスタむルのif / for修食子の構文は、これずうたく組み合わせるこずができるようです。 蚀い換えるず
julia println("positive") if x > 0 # conditional execution x^2 for x=1:100 # generator [ x^2 for x=1:100 ] # comprehension x^2 if x % 3 == 0 for x = 1:100 # filtered generator [ x^2 if x % 3 == 0 for x = 1:100 ] # filtered comprehension
たた、他の蚀語で先䟋があるずいう利点もありたすが、if-then withoutend構文はそうではないようです。

そしお、それは文法にずっおも良いでしょう。

[x^2 if x % 3 == 0 for x = 1:100]は次のようになりたす。

[(x^2 if x % 3 == 0) for x = 1:100]
 ```
Then `for` stay's in infix position which is currently an error. Of course we can change its meaning because of leading `[` but it would not work as generator:
```julia
x^2 if x % 3 == 0 for x = 1:100

[x^2 if x % 3 == 0 for x = 1:100]は次のようになりたす。

それはフィルタリングされたゞェネレヌタではありたせん。 2 if xは、 xがtrueの堎合は2を返したすが、 xがfalseの堎合も䜕かを返す必芁がありたす。 通垞、これはnothingになりたす。 だから、それは数の配列ず䜕も䞎えないでしょう。 これが、フィルタヌ凊理されたゞェネレヌタヌ構文でifがforの埌に来る必芁がある理由の䞀郚です。

はい、その通りです。 倚分それはそのように曞かれるべきです

[for x = 1:100 x^2 if x % 3 == 0]

Afaics、これは括匧を䜿甚せずに有効に解析可胜です、かっこいいです

考え䞭...

[ for x = 1:100 if x % 3 == 0 push x^2]
for x = 1:100 if x % 3 == 0 push x^2  # other keyword could be used, e.g. yield

これは自然な構造にもっず䌌おいたす

for x=1:100 
    if x%3==0 
          push!(somearray, x^2)
    end
end

他の䜕かを芋おいる間、私はちょうどこのゞュレップをもう䞀床芋たした。

私はただif a then b単䞀行圢匏のようなものを望んでいたす。 ゞュリアンの代替品a && bは、数幎間䜿甚した埌でもかなり読めないこずがわかりたす。英語の文章ずしお盎接読む方法はありたせん。

たた、 a && bのむディオムを新参者に説明する必芁があるのは、自明で少しだけ長い代替構文を䜿甚できる堎合、ちょっず恥ずかしいこずだず思いたす。

英語の文章ずしお盎接読む方法はありたせん

a && bは、「if a then also do b」のように、「aandb」ず読みたす。
a || bは、「aは真でなければならない、そうでない堎合はbを実行する」のように「aたたはb」ず読みたす

私はそれが䜕をするかを知っおいたす、そしお私は簡朔にするために時々それを䜿いたす。 しかし、前述のように、ここ数幎は「aずb」を文ずしお芋るこずができないので、できる限り詊しおみおください。 それは毎回軜床の認知的䞍協和です。

察照的に、私は垞に「aたたはb」がかなり読みやすいこずを発芋したした。

おかしなこずに、これのさたざたな偎面が今日仕事で2回出おきたした。

午前䞭、 if ... end &&を䜿甚するJulia PRがあり、コヌドリヌダヌPRレビュヌアずしお、䜙分な劎力が必芁であるず指摘したしたそしお芋逃しがちでした 実行される堎合ず実行されない堎合があるブランチ。 この䟋はa() && b!()の圢匏で、 b!は非垞に倉化したす。 この堎合、 b!()はファむルシステム内のファむルを移動たたは削陀したしたが、これはすぐに危険であるように芋えたしたが、これが問題になるの!a()の堎合のみであり、この堎合は問題であるこずがわかりたせんでした。実際には正しく保護されおいたした。

午埌、別の゜フトりェア゚ンゞニアゞュリアを知らないは、友達ず英語を話すずきに、「 aかb $か」ずいう圢匏の質問に答えるこずがあるず指摘したした。 「「はい」ず応答したす。 圌の゜フトりェア゚ンゞニアの友人だけが理解するでしょう-他の誰もがたったく理解しないでしょう。 普通の人はそうは思わない。 🙂これは私の次のポむントにいくらか関連しおいたす線集そしお私が蚀ったはずですが、䞊蚘のステファンの応答に関連しおいたすが、倚くの人にずっおそれは圌らには起こらないず思いたす。

この問題に察する私のスタンスは、 && たたは|| を䜿甚するこずは、PLのバックグラりンドが匷い人だけが読める分岐の短い構文であり、それでも少し远加するずいうものです。認知的/芖芚的負荷単に&ず&&を区別するため。 孊際的なチヌム科孊者ず゜フトりェア゚ンゞニアの混合で䜜業する堎合、チヌムの半分が積極的に混乱しおいるず感じたす。 ゜フトりェア゚ンゞニアずしおも、論理的な&(::Bool, ::Bool) --> Boolず分岐する&&(::Bool, ::Any) --> Anyの間に奇劙な断絶があるず感じおいたすそうです、埌者は実際には関数ではありたせんが、うたくいけば私の䞻匵を理解できたす 。 タむプ自䜓は別ずしお、ゞュリアでは通垞、前者は「機胜的」であるず予想したすが、埌者の圢匏は、特に2番目の匏で朜圚的な副䜜甚を䌎うこずがよくありたす。

線集これに぀いおもっず考えるず、ここでの問題は完党に副䜜甚ずプログラムフロヌに関するものです。 &&の「機胜的な」䜿甚法は、 &の最適化であるこずを誰もが理解するのは非垞に簡単です。 玔粋でない衚珟では、それらが完党に異なるこずを調敎するこずは比范的困難です。

堎合によっおは、「優先順䜍」はif a then bの方が明確だず思いたす。

guard && c += 1    # probably an error because it's parsed as (guard && c) += 1
guard && (c += 1)  # parentheses required 

if guard then c += 1  # no ambiguity here

たた、゚ディタヌでの構文の匷調衚瀺は、匏の先頭にifをマヌクするのに圹立ちたす。

たた、他の蚀語で前䟋があるずいう利点もありたすが、 end構文のないif - thenはそうではないようです。

if-then-else構文には_倚くの前䟋がある_こずに泚意しおください。

そしお、その構文は、䞊蚘のすべおの蚀語のワンラむナヌに䜿甚できたす。

私はこの議論を1時間ずっず知っおいたので、これが提案された堎合は蚱しおください。

'&&'ず '||'の短絡オプションが奜きなようですセミコロンを䜿甚せずに、1行に単玔なifステヌトメントが必芁なために䜿甚されたす。 しかし、短絡は別の問題を匕き起こす修正のように思われたす。フマムずしお、その構文を理解しお解析するこずは、以前に芋たこずがないか、2番目の匏が必芁な堎合にのみ評䟡されるこずを知らない限り困難です。 人間ずしおの盎感的でない読みは、短絡による芖芚的および論理的欠陥の䞡方が原因であるように思われたす。 それが䜕を意味するのかを知った埌では、読むのが必需品よりも難しいかもしれないようにさえ思えたす。

私が間違っおいなければ、䞡方の問題をマクロで修正できたす。

@if条件の結果

吊定はで凊理できたす。 条件の前、たたは代わりに@ifnotマクロ。 それは私だけなのか、それずもコンピュヌタヌにずっお曖昧さがなく、人間にずっお読みやすく、すべおが1行になっおいるのでしょうか。

それが䜕を意味するのかを知った埌では、読むのが必需品よりも難しいかもしれないようにさえ思えたす。

^私はこれに匷く同意したす。

@if条件の結果

あなたはすでに次のこずをするこずができたす、それはほずんど同じに芋えたす

if condition result end

以䞋は、完党なif-then-else構文のマクロです。 ただし、 ifずelseは予玄枈みのキヌワヌドであるため、マクロは代わりにIf 、 Then 、およびElseを䜿甚したす。

syntax_error() = error("Valid syntax is either `<strong i="20">@If</strong> cond Then ex` or `<strong i="21">@If</strong> cond Then ex1 Else ex2`")

function If(exprs...)
    n_args = length(exprs)

    if n_args == 3
        if exprs[2] != :Then
            syntax_error()
        end

        ex = quote
            if $(exprs[1])
                $(exprs[3])
            end
        end
    elseif n_args == 5
        if ( exprs[2] != :Then ) || ( exprs[4] != :Else )
            syntax_error()
        end

        ex = quote
            if $(exprs[1])
                $(exprs[3])
            else
                $(exprs[5])
            end
        end
    else
        syntax_error()
    end

    return esc(ex)
end

macro If(exprs...)
    If(exprs...)
end

foo(x) = <strong i="22">@If</strong> x > 0 Then println("greater than zero") Else println("less than zero")

そしおここでfooの動䜜を芋るこずができたす

julia> foo(3)
greater than zero

julia> foo(-3)
less than zero

私は次のようなものが奜きです

x0 = 1
x1 = 2
x3 = 3 when y>0  # y>0 is evaluated first
x4 = 4

=よりも優先順䜍が䜎く、右から巊に操䜜される堎合。

あなたはすでに次のこずをするこずができたす、それはほずんど同じに芋えたす

if condition result end

私は知りたせんでした 私はい぀も、通垞は改行があるセミコロンが必芁でしたが。 だから私の堎合、構文

if condition result end

&&を完党に冗長化するので、問題ありたせん 次のこずもできるず思いたす。

if condition result_1 else result_2 end

この堎合、キヌワヌドendを远加する方が、マクロを䜜成するよりもおそらく簡単です。 しかし、ずにかくそれを䜜るために時間を割いおくれおありがずう^ _ ^ドキュメントの1行のifステヌトメントに可胜性を远加するのは良いアむデアですか ?If<enter>を実行するず、結果はすでにかなりの数行になっおいるこずがわかりたす...しかし、この機胜はもっず宣䌝する必芁があるず思いたす。

元の議論に反しお、「if」の1行バヌゞョンでは少し冗長だず思いたすが、「If xtheny」を远加するこずに賛成です。 しかしねえ、コヌドを曞いおください、それはあなたにずっお理にかなっおいたすよね

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