クイックスピーカーズに行きマース
9/19に盛岡で行われるquick speakersに行って来ようと思います。
とりあえず、言語は式ベースのほうが簡単ゆえに美しいって話をしてこようと思ってます。
いつも同じ事で申し訳ない気もするんだけどきにしない。
とにかく、今年一年で、ScalaとhaXeで書いて関数的に書くときれいに書ける。
正規表現+マッチング+演算子順位法できれいに書けるけど演算子順位法って難しそうだから
キゴウ戦法と名前を変えて簡単にできるぞーって話をしてこようと思ってます。
簡単だからパーサもちょちょっと作れるし、LISP級の構造化されたマクロ展開をその言語を使って行える。
でもまだ、作り方が一般的に知られてないから、もっと広める必要がある。
簡単な説明が必要だ。とそんなかんじ。
将来的には正規表現+マッチング+演算子順位法+マルチツリートランデューサでコンパイラ作るといいかなと。
あと、shinhさん優勝おめでとうございます。
あと、kinabaさんが文字列から構造を見つけ出すというのを作ったそうで面白いなと。
haXeで作るプログラミング言語(13)
縁起を担いで2回にわけます。
シンボル
今回はシンボルという概念を導入することで、識別子と文字列を分けて考えることができるようにします。
シンボルはRubyやLispではおなじみの概念ですが、他の言語では聞きなれないものかと思います。
識別子は変数名やキーワードにあたります。たとえば変数ならa、b、stack,tmpとかです。
キーワードはifやfor,swith,case等になります。
前回までの処理系では実は文字列という概念はなくて、シンボルのみが存在していたとも言えると思います。
ということで、シンボルの実装をしていきましょう。
とりあえず、全部チェック
function macroExpand(a:Exp, e:Hash<Exp>):Exp { switch(a) { case op(l, tag, r): return op(macroExpand(l, e),tag,macroExpand(r)); case fun(prm, body, env): return fun(macroExpand(l), macroExpand(body), env); default return a; } }
add(a,b)をa+bにするシンタックスシュガー
function macroExpand(a:Exp, e:Hash<Exp>):Exp { switch(a) { case op(l, tag, r): switch(l){ case sym(s): if(s=="add" && tag=="M()") { var rr:Exp = r; switch(rr) { case op(aa, tag2, bb): if(tag2=="L,") { return op(macroExpand(aa,e),"L+",macroExpand(bb,e)); } default: } } else default: } return op(macroExpand(l, e),tag,macroExpand(r,e)); case fun(prm, body, env): return fun(macroExpand(prm,e), macroExpand(body,e), env); default: return a; } }
次にすべてのパターンにマッチするようにする。