2009-01-01から1年間の記事一覧

lisp on yarv製作日誌12

repl(read - eval - print - loop)で実行できるようにしました。 >(+ 1 2 3 4) 10 >(puts "hello, world") hello, world これをできるようにするためにコンパイラをlisp on yarvで書き直しました。こんな感じで実装しています。 (def (repl) (loop (block ()…

lisp on yarv製作日誌11

コンパイル結果としてrubyのソースを出力する処理系を書いてみました。 http://github.com/mas454/loy-yasm/blob/master/l2r.scm 今まで作ってきたlisp on yarvと同じコードがほとんど動きます。 ただ、クラスメソッドとインスタンスメソッドは、こんな感じ…

lisp on yarv製作日誌10

letを使えるようにしました。 こんな感じです。 (let ((a 10) (b 20)) (puts (+ a b))) #=> 30これはいったん、コンパイラの内部で、 (lamcall (-> (a b) (puts (+ a b))) 10 20)のように変換してからコンパイルしています。

lisp on yarv製作日誌9

作り始めて一月ぐらいたつのですが、肝心なcarとかcdrなどのリスト処理に関する関数を作っていなかったので、実装しました。 リストはrubyのArrayを利用して表現しています。例えば、(1 2)は[1, [2, nil]のようになります。listクラスみたいなのを作って 表…

lisp on yarv製作日誌8

クラスメソッドとインスタンスメソッドを呼び出せるようにしてみました。 Test.newのようにクラスメソッドを呼び出す場合、 (ccall Test new)ccallで呼び出せます。Test1::Test2.abc(10)の場合は、 (ccall (Test1 Test2) abc 10)のように呼び出せます。イン…

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…

パターンマッチに機能追加

Rubyを改造して実装したパターンマッチの文法に機能を追加しました。 http://github.com/mas454/spcamp-ruby1.ネストしたパターンに対応しました。 match [[10,20],30,40] when [[y,20],30,40] puts y end => 102. *パターンを追加しました。 match ["abc", …

今日の勉強

DEBUG HACKS P157からP164 AI入門 P42からP56 Prolorgを勉強

今日の勉強

DEBUG HACKS p153からp156 バックトレース情報がおかしいと感じたときは、スタック破壊を疑うAI入門 p1からp43 20年ぐらい前の本。 古すぎてあまり意味がないような気がするが、とりあえず読んでみる。 この頃は、意識に関する研究があまり進んでいなかった…

コードリーディングメモ:MiniScheme 2

今日はs_goto、s_save、s_returnを詳しく #define s_goto(a) BEGIN operator = (short)(a); return T; ENDおおざっぱに言うとaで指定された命令を実行するマクロ。例えばs_goto(move)でmove命令を実行する見たいな感じです。(実際にはMiniSchemeにmove命令は…

今日の勉強

DEBUG HACKS p134からp143まで

今日の勉強

On Lisp p368からp386CLOSメモ defclassでクラスを定義する。 (defclass circle () (radius center)) radiusとcenterは属性 make-instanceでインスタンスを作成する例.(make-instance 'shape):accessorでアクセサ関数を定義することができる。 例.(defclass …

今日の勉強

On Lisp p362からp368 なかなかおもしろい。 defsetfという関数がよくわからない。

今日の勉強

DEBUG HACKS crashコマンドの使い方 SIGSEGVでアプリケーションが異常終了したOn Lisp P357からP362 mapcarとmapcanの違いが分かった

今日の勉強

DEBUG HACKS アセンブリ言語からソースコードの対応を調べるまでOn Lisp 第24章Prolog まったく理解できなかった。第19章と第22章をやり直す必要がある。

コードリーディングメモ:MiniScheme

Minischeme 仮想マシンみたいな処理系。コンパイルせずにSchemeのコードを 辿っていく。Lispマシンはこんな感じ? 読んだ限りでは、再帰がない。擬似的なgotoやりまくり。 とんでもなくシンプル。継続作成->実行の繰り返し。ソースコード 環境やら継続の保持…

今日の勉強

DEBUG HACKS 関数コール時の引数の渡され方(x86_64編) から アセンブリ言語の勉強法まで x86アセンブラ入門 第1章から第3章まで

Rubyにパターンマッチを実装してみた

Rubyを改造してパターンマッチの機能を実装してみました。 http://github.com/mas454/test こんな感じで動かせます。 def test(arr) match arr when [x,2,3] x when [1,2,3,y] y when [1,2,3,4,z] z end endtest([1,2,3]) => 1 test([1,2,3,4]) => 4 test([1…