2009-11-01から1ヶ月間の記事一覧

lisp on yarv製作日誌7

yasmが使えるようになったので、schemeでコンパイラを書いてみました。 http://github.com/mas454/loy-yasm/blob/master/compile.scm まだ微妙な感じですが、とりあえず関数の定義ができるところまで書けました。 (define out-p (open-output-file "c-test.r…

lisp on yarv製作日誌6

どうしても気になったので、http://d.hatena.ne.jp/shinichiro_h/20071113#1194884481にあるyasm.rbを修正してみたところ、動くようになりました。いろいろ変わっていたので苦労しました。 特にメソッド定義の部分が大きく変わっています。昔はメソッドを定…

lisp on yarv製作日誌5

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…

lisp on yarv製作日誌4

今日は関数を定義できるようにしました。 lblock (def add (x y) (+ x y)) (puts (add 20 30)) end # => 50Rubyにあわせてdefと名前を使うことにしました。それから、lispで定義した関数はRuby側からも呼び出せます。 lblock (def minus (x y) (- x y)) end …

lisp on yarv製作日誌3

今日は、lblock 〜 endの間に複数の式を書けるようにしました。 これまでは、lblock (puts (+ 10 20)) endのように 一つしか式を書けませんでしたが、 lblock (= x 10) (puts (+ x 20)) end # => 30のように複数の式を書けるようになりました。

lisp on yarv製作日誌2

代入をできるようにしました。 こんな感じです lblock (= x 10) end puts x #=> 10ちょっと微妙ですが代入には、'='を使うことにしました。 それから、変数の参照もできるようにしました。 y = 20 lblock (puts y) end #=> 20ruby側で定義した変数の参照もで…

lisp on yarv製作日誌1

今日から、卒研作成しているLispの処理系の製作日誌を書くことにしました。今日は、if文を使えるようにしました。 | tLPAREN keyword_if sexp sexp sexp ')' { $$ = NEW_LIF($3, $4, $5); }パーサはこんな感じです。次はコンパイルの部分 case NODE_LIF:{ LA…

卒研でLispの処理系を作成中

いま、専門学校の卒研で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…