Fulyn-v2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
*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 では、定数パターンしか存在しませんでしたが、変数パター...
変数パターンはすべての入力にマッチするので、 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, ...
? cond
{
| true -> expr1
| _ -> expr2
}
)>
というマクロは、
if(x) print("yes") else print("no") fi
というコードを、
? x
{
| true -> print("yes")
| _ -> print("false")
}
に置換できるようにするかもしれません。
* v2 確定した文法
左再帰的文法をできるだけ避けたいので変更の可能性が大いに...
正確な PEG 文法は[[こちら:https://github.com/lambdalice/F...
** 型の書き方
*** 整数
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
終了行:
*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 では、定数パターンしか存在しませんでしたが、変数パター...
変数パターンはすべての入力にマッチするので、 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, ...
? cond
{
| true -> expr1
| _ -> expr2
}
)>
というマクロは、
if(x) print("yes") else print("no") fi
というコードを、
? x
{
| true -> print("yes")
| _ -> print("false")
}
に置換できるようにするかもしれません。
* v2 確定した文法
左再帰的文法をできるだけ避けたいので変更の可能性が大いに...
正確な PEG 文法は[[こちら:https://github.com/lambdalice/F...
** 型の書き方
*** 整数
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
ページ名: