AMOP到着

そのうち読む

ProductName The Art of the Metaobject Protocol
Gregor Kiczales
The MIT Press / 4372円 ( 1991-07-30 )


絶対。

初めての人のためのLISP[増補改訂版]

これは欲しいのう

ProductName 初めての人のためのLISP[増補改訂版]
竹内 郁雄
翔泳社 / ¥ 3,129 ()
近日発売 予約可

Programming Clojureを読みはじめた

年末か年始に日本語版がでるそうなのでそれまでには一通り読んでおきたい。

ProductName Programming Clojure (Pragmatic Programmers)
Stuart Halloway
Pragmatic Bookshelf / ¥ 3,198 ()
在庫あり。

Perl/Python/Rubyプログラマは特に6章のConcurrencyのところ7章のマクロを読むと良いですぞとprefaceに書いてあった。


090923現在2775円って洋書にしてはかなり安い値段な気がする。

OCamlとlambda

後者は構文糖衣?

# let f = fun x -> x * x
val f : int -> int = <fun>
# let g x = x * x;;
val g : int -> int = <fun>

ここまでやれる

# ( * ) 4 4;;

Common Lispだとこうかな

(setq f (lambda (x) (* x x)))
(funcall f 4)

(defun g (x) (* x x))
(g 4)

Programming Clojure

予約したまま5ヶ月近くたち、忘れかけてたProgramming Clojureが発送された。

ProductName Programming Clojure
S Holloway
Pragma / ¥ 3,368 ()
通常9~13日以内に発送

MooseでLisp(MoospのFunction::Setq)

やさしい Lisp の作り方 by Java and by C#を参考に書いてみる。

sub fun {
  my ($self, $arguments) = @_;
  my $arg1 = $self->eval->eval($arguments->cdr)->car;
  my $sym = $arguments->car;
  $sym->value($arg1);
  $self->env->put($sym,$sym->name);
  return $arg1;
}

束縛するものがリストだと、まだうまくいかない。

Moosp> (setq a 5)
5
Moosp> (setq b 2)
2
Moosp> (+ a b)
7
Moosp> (setq c (+ 1 2))
Attribute (value) does not pass the type constraint because: Validation
failed for 'Moosp::Sexp' failed with value Moosp::List=HASH(0xa2a110) at lib/Moosp/Function/Setq.pm line 22
Moosp::Function::Setq::fun('Moosp::Function::Setq=HASH(0xa208a0)',
'Moosp::List=HASH(0xa29a80)') called at lib/Moosp/Eval.pm line 93
Moosp::Eval::eval('Moosp::Eval=HASH(0xa1dcc0)',
'Moosp::List=HASH(0xa29fa0)') called at lib/Moosp.pm line 67
Moosp::run('Moosp=HASH(0x804320)') called at moosp.pl line 7

MooseでLisp(MoospのFunction::Add)

やさしい Lisp の作り方 by Java and by C#を参考に書いてみる。

REPLまで出来て

(+ 1 2)

は動くのに

(+ (+ 1 2) 3)

が動かなくて、evalの再帰が悪いのかと思ったら、Functionのほうだった。

sub fun {
  my ($self, $arguments) = @_;
  my $arg1;
  my $ret =  Moosp::Integer->new(value => 0);
  return $ret if ($arguments->isa('Moosp::Nil'));

  while (1) {
    $arg1 = $self->eval->eval($arguments->car);
    $ret = $ret->add($arg1);
    last if ($arguments->cdr->isa('Moosp::Nil'));
    $arguments = $arguments->cdr;
  }
  return $ret;
}

carがfunctionの場合はcdr部は全て評価済みにしておかないといけないんだった。

やっとうまく動いた

Moosp> (+ (+ 1 2) (+ 3 4))
10

tak実行が見えてきた。

MooseでLispを実装してみる(REPL)

やさしい Lisp の作り方 by Java and by C#を参考に書いてみる。(14日目のあたり)

REPLまでやって対話環境にしてみたら、エラーが出まくる。readerよりはevaluatorまわりの気がしないでもない。なんか細かいとこから見直さないといけなさそうなのでTest::Pod::Coverageとかちゃんと通るようにという気晴らしを。

明日から、帰省するので向こうでちまちまデバッグをする予定。ゴールデンウィーク中には最後(takの実行)までは行きたい。

MooseでLispを実装してみる(Eval)

やさしい Lisp の作り方 by Java and by C#を参考に書いてみる。(13日目のあたり)

REPLのE、つまり評価器をつくる。これが終われば統合して処理系を完成させるのみ。

しかし10日目のCARがevalしたあとのcarを返すようになっているのだけど、evalはlistを戻さんよ?最後の処理系の完成のところで色々バグが見つかる予感(大)

MooseでLispを実装してみる(Readerのデバッグ)

やさしい Lisp の作り方 by Java and by C#を参考に書いてみる。(12日目のあたり)

()がNilになるようにReaderをいじる。makeListメソッドをちょっと変えればいいだけ。