2009-11-01から1ヶ月間の記事一覧
yasmが使えるようになったので、schemeでコンパイラを書いてみました。 http://github.com/mas454/loy-yasm/blob/master/compile.scm まだ微妙な感じですが、とりあえず関数の定義ができるところまで書けました。 (define out-p (open-output-file "c-test.r…
どうしても気になったので、http://d.hatena.ne.jp/shinichiro_h/20071113#1194884481にあるyasm.rbを修正してみたところ、動くようになりました。いろいろ変わっていたので苦労しました。 特にメソッド定義の部分が大きく変わっています。昔はメソッドを定…
lambdaを使えるようにしました。 lblock (= add (-> (a b) (+ a b))) end puts add.call(10, 20) #=> 30lisp側から呼び出す場合は、 def lamcall(lam, *args) lam.call(*args) endのようなメソッドを定義して、 lblock (= add (-> (a b) (+ a b))) (puts (la…
今日は関数を定義できるようにしました。 lblock (def add (x y) (+ x y)) (puts (add 20 30)) end # => 50Rubyにあわせてdefと名前を使うことにしました。それから、lispで定義した関数はRuby側からも呼び出せます。 lblock (def minus (x y) (- x y)) end …
今日は、lblock 〜 endの間に複数の式を書けるようにしました。 これまでは、lblock (puts (+ 10 20)) endのように 一つしか式を書けませんでしたが、 lblock (= x 10) (puts (+ x 20)) end # => 30のように複数の式を書けるようになりました。
代入をできるようにしました。 こんな感じです lblock (= x 10) end puts x #=> 10ちょっと微妙ですが代入には、'='を使うことにしました。 それから、変数の参照もできるようにしました。 y = 20 lblock (puts y) end #=> 20ruby側で定義した変数の参照もで…
今日から、卒研作成しているLispの処理系の製作日誌を書くことにしました。今日は、if文を使えるようにしました。 | tLPAREN keyword_if sexp sexp sexp ')' { $$ = NEW_LIF($3, $4, $5); }パーサはこんな感じです。次はコンパイルの部分 case NODE_LIF:{ LA…
いま、専門学校の卒研でLispの処理系を作成しています。 だいぶ前から、簡単な処理系を書いたりしていたのですが、 今回は、YARV 上で動作するLispの処理系を作成しています。今のところはRubyに埋め込むような形で実装していて、 def add(i, j) i + j end l…
Rubyを改造して演算子を追加する機能を実装してみました。 http://github.com/mas454/spcamp-rubyoperator 追加したい演算子名 で演算子を追加することができます。 実際に使うと、こんな感じです class Fixnum def add(y) self + y end end operator add pu…