Desk言語概説

4726 ワード

  • 値と型とエフェクトがある
  • 全ての値は不変である
  • 型が値の真の名である
    • 変数名はビジュアルプログラミングには不要であるため存在しない
    • 同じ型の値がスコープに複数存在して区別することはできない
  • nominalに定義されるものは存在しない
    • 型付けにはstructural subtypingを用いる
  • 識別子には予約記号で始まらない空白を含む任意のUTF-8文字列を用いることができる
    • camelCasesnake_caseはアンチパターンである
    @first name "ryo"
    (型は@first name 'string)
    
  • ()の中身がコメントである
  • 全ての型は先頭のトークンにより種別を判断できる
    • identは型変数である
    • 'numberは数値である
    • 'stringは文字列である
    • * type, ...は直積である
      • 単に*はunitを表す
      • * a, b <: aである
    • + type, ...は直和である
      • 単に+はneverを表す
      • a <: + a, bである
    • [type]はベクターである
    • {type}は集合である
    • \ type, ... -> typeは関数である
    • $ ident ~ typeは全称である
    • @ident typeはラベル付された型である
      • a <: @label aかつ@label a <: aである
      • @identがブランドである場合はa <: @brand aでない
    • ! type ~ effect expr はエフェクトを伴う型である
      • effect exprはエフェクト集合を計算する式である
      • {effect, ...}はエフェクト集合である
      • + effect expr, ...はエフェクト集合の加算である
      • - effect expr, effect exprはエフェクト集合の減算である
      • > type ~ type, ...は関数呼出に伴うエフェクトの集合である
    ! 'string ~ - > a 'number, {'number => 'string}
    (文字列型であり、a('number)のエフェクト集合から
     {'number => 'string}を引いたエフェクト集合を持つ)
    
    • _は推論される型である
    • ?はHoleである
    • % type, ...が型クラスとなるであろう
  • エフェクトは入力型と出力型を指定してtype => typeと表現する
  • 全ての構文は式およびリテラルである
  • リテラルには数値・文字列・ベクター・集合・直積がある
    • 11.52/3は数値である
    • "abc"は文字列である
    • [expr, ...]はベクターである
    • {expr, ...}は集合である
    • * expr, ...は直積である
  • 全ての式は先頭のトークンによって種別を判断できる
    • ?はHoleである
    • $ expr ~ exprはlet式である(~は省略可能)
      • $ expr: type ~ exprのように型を明示した定義も可能である
      (let number = 1 in number)
      $ 1 ~ &'number
      
    • > type ~ type, ...は唯一の演算子である関数呼び出しである
      • > typeの場合、値を参照する
    • + expr ~ type -> expr, ...は唯一の制御式であるmatch式である
      • 直和型を型に場合分けし、それぞれ処理を行う
      • match式の型は各caseの型の直和となる
      + expr ~
        'number ->
          @this is a number *
        'string ->
          @this is a string *
      (式全体の型は + @this is a number *, @this is a string *) 
      
    • & type> typeである
    • \ type, ... -> exprは関数である
    • ^ expr : typeは型アノテーションである
      ^> \ 'number, 'number -> @sum 'number ~ 1, 2: 'number
      (@sum 'numberを'numberにキャスト)
      
    • ! expr => typeはエフェクトのperformを示す
      • perform式の型はtypeとなる
      • 計算が中断されexprの計算結果と継続がハンドラーに渡る
      • =>以降は省略可能になるはずである
    • 'handle expr ~ effect -> expr, ...はエフェクトフルな式にハンドラーをアタッチする
      • ハンドラーではperformされたエフェクトの入力型の値を使うことができる
      • エフェクトフルな式の型をt、performされたエフェクトをinput => outputとするときoutput => tなエフェクトをperformすることで継続を実行できる
      • その際、代わりに<! exprでも継続できる
      • 継続は任意の回数実行できる
      'type add \'number, 'number -> @sum 'number
      'handle
        $ ! "a" => 'number: x ~
        >add &x, &x (performした結果を2倍する)
      'string => 'number ->
        >add (1でcontinueした結果と2でcontinueした結果を足す)
          <! 1,
          <! 2
      (1*2 + 2*2 = 6を返す)
      
    • @ident exprは式の型にラベルを付ける式である