*Fulyn v2
-(by [[lambdalice]], 2014.05.20)

**しばらく触ってない間にいろいろ変わってしまった!

Mono (.NET のオープンソース実装)をハックしてたり、Nemerle という言語のコンパイラをいじったりしていてすごく忙しかったのです。

ごめんなさい!これから追いつきます。

旧ヴァージョンの Fulyn は[[こちらへ>Fulyn]]。

* 進捗

型推論器が書き終わったので、コンパイル部分を書いています。

* v2 の特徴

Fulyn v1 は美しくないところがまだまだあったので、言語仕様をさらにシンプルにし、それでいて表現力をさらにあげます。

** 全てを式に

Fulyn v2 では、プログラムを式の列として扱います。

式には、定数、関数、代入文、パターンマッチ文、リテラルなどがあります。

** 型推論の強化

型推論は hindley milner 型を参考にして Fulyn v2 の構文構造に合わせています。

外側の式から再帰的に評価され、内側に含む式についての情報が得られた場合はあるべき型を示す型ヒントを与えることによりラムダ式の型記述の省略などを実現しています。

後ろの文脈からの型推論も実装しようとしていますが、計算時間が長くなりそうなので一旦保留しています。

** ブロックのサポート

Fulyn v2 では、ブロック自体を一つの式として扱います。

これにより、複文ラムダの実現が可能になります。

これで、関数をラムダで書くことが可能になります。

    main = () => {
      x = plusone(5)
      putnum(x)
    }
    
    plusone = i => add(i, 1)

** パターンマッチの強化

v1 では、定数パターンしか存在しませんでしたが、変数パターン、Cons パターンなどのその他のパターンも実装します。

変数パターンはすべての入力にマッチするので、 v1 の () => ... は廃止されます。

    source = read()
    result = ? source {
      | 'y' => 1
      | 'n' => 0
      |  x  => { print("invalid answer: "); print(x); -1 }
    }

    array = [0, 1, 2]
    tail_of_array = ? array {
      | head :: tail => tail
      | _ => []
    }

** マクロ

マクロはあんまりやる気がわかないので保留状態です。

    <( if :: "if", "(", cond, ")", expr1, "else", expr2, "fi" -> 
      ? cond
      {
        | true -> expr1
        | _ -> expr2
      }
    )>

というマクロは、

    if(x) print("yes") else print("no") fi

というコードを、

    ? x
    {
      | true -> print("yes")
      | _ -> print("false")
    }

に置換できるようにするかもしれません。

* v2 確定した文法

左再帰的文法をできるだけ避けたいので変更の可能性が大いにありますが、特に断りのないものは確定しています。

正確な PEG 文法は[[こちら:https://github.com/lambdalice/Fulyn/blob/new-generation/src/Parsing/mainparser.n]]

** 型の書き方

*** 整数

    int

*** 配列

    [int]

*** 関数

    int -> int
    (int, int) -> int

** リテラル

*** 整数

    1234
    0xABCD

*** 文字列

    "abcd"

*** 配列

    [1, 2, 3, 4]

*** ラムダ

    x => mul(x, 2)
    
    (x, y) => add(x, y)
    
    () => {
      print("hello!")
      print("good bye")
    }

** 変数

    x
    count_1

** 関数呼び出し

左再帰文法を避けたいため考え中。今のところは

    func(arg)

としている。

** 代入

    x = 1
    y : (int, int) -> int = (x, y) => add(x, y)

** ブロック

    {
      print("hello")
      1 + 2
    }

** パターンマッチ

    ? x
    {
      | 1 => print("one")
      | 2 => print("two")
      | _ => print("other")
    }

** インライン

    {# 03 3F $x 00 #}

* こめんと

#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS