2007-09-01から1ヶ月間の記事一覧

演算子定義できるパーサとインタプリタ

ほぼ、C言語の演算子が定義できてて+αの演算子がついてる言語です。 最初構文木を作って、それをインタプリタで動くいう。 なにが、新しいのかというと、プログラムは数値や識別子以外は演算子でつながってるってこと。 演算子でつながってるだけなので、構…

100オーダーな優先順位付き演算子定義構文解析器

優先順位をリストで管理してやることで、とびとびの値の優先順位を付けられる ようなパーサを作ってみました。サンプル http://sakurai.s59.xrea.com/diary/100order.html以下ソース

優先順位付き演算子定義の可能な小さな構文解析器

以下のような簡単な構文解析器を作ります。前も書いたような気がしますが、 たまに、やらないと忘れて難しいことになってしまうし。 あろはさんが面白そう言ってたのでまぁ、のせて見ます。 出来たもののアドレス、、、。 http://sakurai.s59.xrea.com/diary…

エコする充電器

なにやら、NHK見てたら、携帯電話の充電器をコンセントにつなげっぱなしにしておくと、 待機電力を食うという話をしていた。携帯を持っている人口がかなり多いので、 それをはずしておくだけでずいぶんエコらしい。 しかし、はずすのはめんどくさい。 スイッ…

Mini_0

今回はSECD ManiaのMini_0 SECDマシンのjavascript版です。 このマシンは Henderson を継承しています。 オリジナルの Henderson コンパイラはただ1つだけ 算術構文を使っています - (ADD (QUOTE 1) x)。1. SECDからすべての算術コードを削除し、 INC コー…

selfjs.html

<script src="secd_cod.js"></script> <script src="compiler.js"></script> <script> Array.prototype.toString=function(){return"["+this.join(",")+"]"} function main() { document.getElementById("compiler.secd.new").value=""; document.getElementById("fout").value="initialize ...\n"; setTimeout(main2,100);…

compiler.js

function COMPILE (E) { return COMP(E,null,[4,[21,null]]) function ATOM(E){ return E==null || typeof(E) != "object" } function COMP (E,N,C) { if(ATOM(E)) return [1,[LOCATION(E,N),C]] switch(E[0]){ case "QUOTE": return [2,[E[1][0],C]] case "…

HendersonのSECDマシンコンパイラのJavaScript版

compiler.lispは、lispがわかっていればいいのかもしれませんが、 括弧がやはり、読みにくいのでjavascriptに移植して可読性UP+高速化しました。 ファイル名はcompiler.jsです。 selfjs.htmlを開くと、compiler.lispをcompiler.jsを使ってコンパイルして…

はてなメッセージが恐い

メールをチェックしていたら、こんなメールが!! 送信者 h_sakurai あて先 h_sakurai 件名 [Hatena::S] [javascript] 継続インタプリタ これはなに?? http://d.hatena.ne.jp/h_sakurai/20070917#p1 http://m.hatena.ne.jp/送信者 h_sakurai あて先 h_saku…

self.html

<script src="secd_cod.js"></script> <script> function main() { document.getElementById("fout").value="initialize ...\n"; setTimeout(main2,100); } function main2() { init(); printf("Reading compiler code ...\n"); flush(); setTimeout(main3,100); } function main3() { readSFrom("compil…

compiler.secd

(6 2 NIL 3 (1 (0.0) 2 NIL 14 8 (2 NIL 9) (2 NIL 1 (0.0) 11 13 1 (1.5) 4 1 (0.0) 10 11 13 9) 5) 13 3 (1 (0.0) 2 NIL 14 8 (2 NIL 9) (2 NIL 1 (0.0) 11 13 1 (1.4) 4 1 (0.0) 10 10 13 9) 5) 13 3 (6 2 NIL 3 (1 (0.0) 11 2 1 1 (0.0) 10 15 13 5) 13 …

compiler.lisp

(LETREC COMPILE (COMPILE LAMBDA (E) (COMP E (QUOTE NIL) (QUOTE (4 21)))) (COMP LAMBDA (E N C) (IF (ATOM E) (CONS (QUOTE 1) (CONS (LOCATION E N) C)) (IF (EQ (CAR E) (QUOTE QUOTE)) (CONS (QUOTE 2) (CONS (CAR (CDR E)) C)) (IF (EQ (CAR E) (QUO…

secd_cod.js

/* secd_mem */ var maxReg = 10; var regs = new Array(maxReg + 1); function error(s) { printf("\n"+s+" !\n"); flush(); throw s; } function showStat() { printf("--- SECD stats: Loops= "+loopCnt+"\n"); } /** * regs[s]のcarをregs[d]に入れる。 …

HendersonのSECDマシン

SECD ManiaのHendersonのSECDマシンをjavascriptに移植したので、載せておきます。 self.htmlを開くとcompiler.secdコードを使ってcompiler.lispを セルフコンパイルします。結果が画面上に表示されます。 ファイル読み込みは、AJax使ってます。 VMなので、…

継続インタプリタ

やっぱり、継続をまちがえてたので修正した。 まだ間違えているかもしれない。

できるだけ短い継続インタプリタ

call-ccの実装がとりあえず出来たっぽいバージョン よくわかってないので、怪しい。

できるだけ短い継続インタプリタ

この間ものの継続渡しバージョン+α 今までのは、fiberみたいなものだったので、call-ccを作ろうと思ってるけど、出来てない。 call-ccの実装が出来てない(泣

とりあえず、只のインタプリタ。 こんなんでいいか。 <script> Array.prototype.toString = function(){ return "["+this.join(",")+"]"} Object.prototype.toString = function(){ var a = []; for(var i in this) a.push(i+":"+this[i]); return "{"+a.join(",")+"…

書きかけ 書いてたらだんだん眠くなってやめた。 環境とか、lambdaとクロージャとそのへん、こんがらがり中。 適当になってるのがよくないかんじ。 MiniDってののソースが気になる今日この頃ですけど、時間ね。 単なるゴミなかんじ。 <script> Array.prototype.toStr…

<script> Array.prototype.toString = function(){ return "["+this.join(",")+"]"} function eval(s,env){ function getEnv(env,a) { if (env[a] != null) return env[a]; if (env.parent == null) throw "error"; return getEnv(env.parent, a); } function setEnv…

継続付きインタプリタ(2)

今日は変数を定義して読み込んだり出来るように拡張します。 そのために、環境を導入します。 function eval(s){ if (s instanceof Array) { switch(s[0]){ case "add": return eval(s[1]) + eval(s[2]); case "mul": return eval(s[1]) * eval(s[2]); } } r…

12行で書ける継続付きインタプリタ

どうも、継続がよくわからないので、とても短いサンプルを作ってみました。 ["mul", 3, ["add", 1, 4]] のようなjsonデータを読み込み、実行すると15を返すような インタプリタを作ると以下のようになります。 function eval(s){ if (s instanceof Array) { …

secdマシン再び

miniSchemeのソース読んだり、secd maniaのソースを読んだり、 d言語に移植したり、javascriptに移植したりして勉強してます。 継続の実装を10分でできるようになりたいのだけど、いまだわからん。 いや、だいたい、わかってるとおもうんですけどねぇ。 う…