「式とステートメント」みたいなページほしい #100

Open
ufcpp opened this Issue Sep 24, 2016 · 5 comments

Projects

None yet

1 participant

@ufcpp
Owner
ufcpp commented Sep 24, 2016 edited

書く場所: http://ufcpp.net/study/csharp/structured/miscexpressions/

参考というか前にBIerで書いたやつ: http://www.buildinsider.net/column/iwanaga-nobuyuki/002

  • 式とは、ステートメントとは
    • 式はだいたいどこにでも書ける。
    • 式は値を返せないといけない。
    • F#とかScalaとかみたいにすべてが式の言語もある。
  • 式はどんどん増えてる
    • C# 2.0で、??、匿名メソッド
    • C# 3.0で、オブジェクト初期化子、コレクション初期化子、ラムダ式、クエリ式
    • C# 5.0で、await
    • C# 6で、?.、拡張メソッドでもコレクション初期化子
    • C# 7で、throw式、変数宣言式(is, out var)
    • C# 8?、match式?、is/out var以外の変数宣言式
  • 式が書きやすい構文もどんどん増えてる
    • C# 6で、expression-bodied function members
      • get-only property, indexer, method, operator
      • void なものにも使える
    • C# 7で、ctor, dtor, getter, setter も
  • 型が不定の式
    • throw 式の戻り値の型は「任意」、いわゆるbottom型
    • nullも型を持ってないんだけど。値型には代入できず
    • null, throw式がからむ? :
      • cond ? null : throw exとかは型が確定しなくてダメ
  • 共通基底の推論(今はできない。検討中)
    • A, Bが共通の基底クラスから派生しているものとして
    • cond : new A() : new B()
    • new[] { new A(), new B() }
@ufcpp
Owner
ufcpp commented Sep 25, 2016 edited
  • どこでも書けるがゆえに、優先順位、結合の向き、評価順序
    • 優先順位は表にする
    • 代入系、ラムダ式、??は右から左、それ以外は左から右に結合
    • 評価順は完全に左から右

a * b + c * d みたいなのがどういう評価を受けるか。数学の式でも、掛け算・割り算の方が、足し算・引き算より優先ってのがあるけど、それをプログラミング言語の式でも考えないといけない。

式ってだいたいはこの手の「演算子」だけども。というか、式と演算子って区切りあいまいというか。
x => yみたいなのも、「ラムダ式」って言ったり、「goes to演算子」とか「矢印演算子」って言ったり。
new X()みたいなのも、「オブジェクト生成式」って言ったり、「new演算子」って言ったり。

ちなみに、throw式は?:??の間。

(Ref(++i), Ref(++i)) = (Val(++i), Val(++i)); みたいなのも、評価は左から順。
http://ufcpp.net/study/csharp/datatype/deconstruction/#evaluation にはちょこっと書いてる。リンク?

@ufcpp
Owner
ufcpp commented Sep 25, 2016 edited
  • 式しか書けない場面の例
    • 初期化子の類(オブジェクト初期化子、コレクション初期化子、フィールド初期化子、this, base全部)

以下の2つ、ステートメントを許す場面では全く同じ意味だけど、フィールドの初期化とかに使えるのは後者だけ。

var p = new Point();
p.X = 1;
p.Y = 2;
var p = new Point
{
    p.X = 1,
    p.Y = 2,
};
@ufcpp
Owner
ufcpp commented Sep 26, 2016
  • そういや、優先度考えたら x+++xは、x++ + xの意味か。
    • x+++++x((x++)++) + xの意味。1個目の++の結果が右辺値なので、2個目の++ができなくてエラーに
@ufcpp
Owner
ufcpp commented Sep 26, 2016
  • ステートメントか文かという問題
    • うちのサイト、大半が「文」になってるはず
    • 割かし最近は自分は好んでステートメントを使ってる
      • MSがステートメントを使ってるんで
      • 文だとsentenceっぽく。statementの「断定形の文、陳述、記述」みたいなニュアンス抜けるし
    • でも、混在って混乱招くよなぁ…
@ufcpp
Owner
ufcpp commented Oct 25, 2016
  • 制限のある式
    • 式ツリーではC# 4.0以降に入った式は使えない
      • Expressionノードがない、他の機能に展開すべきか、新しいノードを足すべきか
    • 初期化子で使えないものも。out var, is var。
@ufcpp ufcpp referenced this issue Oct 25, 2016
Closed

throw式 #89

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment