Fulyn-v2
の編集
http://osecpu.osask.jp/wiki/?Fulyn-v2
[
トップ
] [
編集
|
差分
|
バックアップ
|
添付
|
リロード
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
-- 雛形とするページ --
BracketName
FormattingRules
FrontPage
Fulyn
Fulyn-v2
Fulyn_Samples
Help
InterWiki
InterWikiName
InterWikiSandBox
K
KOR_PIT8254
KWVM.NET
Liva
MANA
MenuBar
OSECPU_FPGA
PG_MANA
PHP
PukiWiki
PukiWiki/1.4
PukiWiki/1.4/Manual
PukiWiki/1.4/Manual/Plugin
PukiWiki/1.4/Manual/Plugin/A-D
PukiWiki/1.4/Manual/Plugin/E-G
PukiWiki/1.4/Manual/Plugin/H-K
PukiWiki/1.4/Manual/Plugin/L-N
PukiWiki/1.4/Manual/Plugin/O-R
PukiWiki/1.4/Manual/Plugin/S-U
PukiWiki/1.4/Manual/Plugin/V-Z
RecentDeleted
SandBox
WikiEngines
WikiName
WikiWikiWeb
YukiWiki
hikalium
hikarupsp
hikarupsp_ELCHNOS
hikarupsp_ELCHNOS_IDE
hikarupsp_FrontEndCode
hikarupsp_WebCPU-VM
hikarupsp_WebCPU-VM_internal
hikarupsp_study_hh4
impressions
impressions0000
jpag0000
jpag0001
jpag0002
jpag0003
jpag0004
jpag0005
lambdalice
mandel59
members
memo0000
memo0001
memo0002
memo0003
memo0004
memo0005
memo0006
memo0007
memo0008
memo0009
memo0010
osask
osecpu4android
page0000
page0001
page0002
page0003
page0004
page0005
page0006
page0007
page0008
page0009
page0010
page0011
page0012
page0013
page0014
page0015
page0016
page0017
page0018
page0019
page0020
page0021
page0022
page0023
page0024
page0025
page0026
page0027
page0028
page0029
page0030
page0031
page0032
page0033
page0034
page0035
page0036
page0037
page0038
page0039
page0040
page0041
page0042
page0043
page0044
page0045
page0046
page0047
page0048
page0049
page0050
page0051
page0052
page0053
page0054
page0055
page0056
page0057
page0058
page0059
page0060
page0061
page0062
page0063
page0064
page0065
page0066
page0067
page0068
page0069
page0070
page0071
page0072
page0073
page0074
page0075
page0076
page0077
page0078
page0079
page0080
page0081
page0082
page0083
page0084
page0085
page0086
page0087
page0088
page0089
page0090
page0091
page0092
page0093
page0094
page0095
page0096
page0097
page0098
page0099
page0100
page0101
page0102
page0103
page0104
page0105
page0106
page0107
page0108
page0109
pagenames
populars
seccamp2013
seccamp2014
seccamp2017
ttwilb
ttwilb-asmi
yao
*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
タイムスタンプを変更しない
*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
テキスト整形のルールを表示する