« May 2010 | Main | July 2010 »

2010.06.29

Rubyチップ

twitterで知りました。

http://itpro.nikkeibp.co.jp/article/NEWS/20100628/349693/

記事の図を見ていると、CPUの上にRTOSが載った状態でインタープリタの部分のみハードウェア化のようです。こうなるとCPUが何になるかがきになりますね。NiosやMicroBlazeだと、ライセンスやら移植性の問題が出てくるので、SHやARMまで含めて汎用CPUで結果出して欲しいですね。

| | Comments (0) | TrackBack (0)

2010.06.28

関数プログラミングの楽しみ

面白い。8章がまるまるHaskellでハードウェア記述です。Lavaというライブラリを使っています。
http://raintown.org/lava/

FPGAの実装まで書いてあるので、興味ある人は買うべし!
8章の翻訳は非常に良いレベルです。下手なEDAツールの直訳パンフよりもわかりやすいです。

| | Comments (2) | TrackBack (0)

2010.06.03

Lexical bindingとclosureがわからない その2

もう一度、書き直してみた。

guile使って分からないことを説明してみる。

guile> (define a 100)
guile> (define foo (lambda () (display a)))
guile> (foo)

100が返ってくる。これは分かる。

guile> (let ((a 10)) (foo)))
guile> (foo)
100

a を10に束縛して、fooを呼んでも100が返ってくる。Lexical Bindingだから。

guile> (set! a 200)  ;set! に変更した
guile> (foo)
200

僕の理解だと、fooは定義時の環境(aは100)をそのまま適用するから100が返ってきて欲しいんだけど、何を間違えているんだろう。

僕の間違った理解だと、
・環境とは、変数名と値の組み合わせのリスト(a-list)である。
・関数作成時に、生成時の環境と関数自体をセットで持ってクロージャを作る。
 これをdef.envとすると、(define foo (lambda () (display a)))を評価した時点で、fooに対応するdef.envでは、aは100に束縛されている。
・(set! a 200)は、現在の環境(current.env)のaの値を変えるはずで、def.envには影響を与えないはず。なんでその後(foo)したらdef.envのaまで200になるの?
・current.envを変更したらdef.envが変わる、もしくはdef.envを変更したらcurrent.envが変わるならクロージャの意味無くね?

http://twitter.com/kinaba/status/15312435735
で、無事解決しました。

値じゃなくて、保存している場所を解決しているなら、このような動きになりますね。
私の謎の質問に回答してくださった皆さん、ありがとうございます。

追加
http://d.hatena.ne.jp/yuki_neko_nyan/20100603
これ、何やってるんだろう。
guileじゃ上手く動かなかったです><

| | Comments (1) | TrackBack (0)

Lexical bindingとclosureがわからない

guile使って分からないことを説明してみる、。

guile> (define a 100)
guile> (define foo (lambda () (display a)))
guile> (foo)

100が返ってくる。これは分かる。

guile> (let ((a 10)) (foo)))
guile> (foo)
100

a を10に束縛して、fooを呼んでも100が返ってくる。Lexical Bindingだから。これも分かる。

guile> (define a 200)
guile> (foo)
200

僕の理解だと、fooは定義時の環境(aは100)をそのまま適用するから100が返ってきて欲しいんだけど、何を間違えているんだろう。

| | Comments (1) | TrackBack (0)

2010.06.02

Lisp in Small Peices読んでる

まだ第一章の途中。第一章はThe basics of interpretationと言うことで、SICPの4章と同じくscheme上で動く俺schemeを作ってます。

SICPとの違いは、define-syntax等が説明もなく使われschemeの機能は分かっている前提で書かれています。また、SICPでは、
(define (first-exp seq) (car seq))
(define (rest-exps seq) (cdr seq))
のようにcar,cdrは、必ず意味づけを明確にしていますが、この本はcadr等が普通に使われています。SICPの方が教育的ですね。

closureに関してもSICPより少し突っ込んでいて、関数定義時の環境を使う理由について例を挙げて書いてあります。関数適用時に、実行時の環境を使う場合と、関数定義時の環境を使う場合の2つのコードを用意して、違いが説明してあります。一つの関数に、一つの環境を対応付けようとすると、定義時の環境しかありえないという説明があります。なるほど。

SICPではclosureの実装にはlist関数を使い、関数のbodyと関数生成時の環境をセットにして管理しています。SICPで使っているソースはこれ。
(define (make-procedure parameters body env)
  (list 'procedure parameters body env))
Lisp in Small Peicesの方は、素のschemeのclosureを使う事で、俺処理系のclosureを実装しています。schemeの機能はSICPより突っ込んで使っているので、違いを比べてみると面白いです。

| | Comments (0) | TrackBack (0)

« May 2010 | Main | July 2010 »