ニセSchemeで継続させたい

メモです。
今、俺のニセSchemeで継続ができるように頑張っています。
とりあえず、今の実装ではなくスタックマシンライクなバーチャルマシンで
実行すれば上手くいくんじゃないかと思い、
YARVとかFORTHとかを調べて、必死こいて考えています。


そこで問題に気がついたのですが、今のマクロは以下のように書けます。
マクロとラムダをごっちゃにしてもそれなりに動きます。

(define my-or (macro (a b)
  (list (quote if) a a b)))

(map (list 
       my-or                                   ; 1とだけ表示される。戻り値1
       (macro (a b) (list (quote if) a b NIL)) ; 1と2が表示される(and)。戻り値2
       +                                       ; 1と2が表示され、戻り値3
       (lambda (a b) (+ a b))                  ; + と同じ
     (lambda (f) (f (p 1) (p 2))))

ここまで自由だとコンパイルのやりようがない。
なので、実行前にマクロは展開しようと思います。
ついでに文法も変更します。

(defmaco my-or (a b)
  (list (quote if) a a b))
(my-or NIL T)
(list my-or) ; これはとりあえずコンパイルエラーにする。

必ず、マクロの宣言時はマクロの名前を付けるようにして、
コンパイル時のヒントに使う。
(defmacro ...)の戻り値は必ずNILで、(my-or x y)のように名前を参照しないと呼び出せないようにする。
マクロは、変数関数とは違うスコープに格納され、実行時には参照できないことに。


今の実装よりちょっと退化しちゃうけど、しょうがないか。
今は、コンパイラの実装のしやすさ優先にして、自由さはあとから何とかすればいいし。
今週中にマクロの展開はできればいいな。

出向先の会社の皆さんと飲んできました。

ここ最近体力が弱りまくっているので、飲まないつもりでしたが、日本酒と焼酎を飲んでしまいました。
最近うすうす感じてるのですが、焼酎ってあまり酔いにくいのかもしれない。
まあ別に大して上手いとも思わないから別にどうでもいいんだけども、
無理やり飲ませたい人がいつような時は便利かもしれない。

去年はずっといわきに行っていたので、初めて飲む人も何人かいたのですが、かなり楽しく飲めてきました。
二人くらい暴走してたのをみて、久しぶりに腹が痛くなるほど笑えました。
また飲みにいきたいなー。

ニセSchemeでquine

以下のコード、全く修正無しに一発で動かせました。

((lambda (x)
  (list x (list (quote quote) x)))
 (quote
    (lambda (x)
      (list x (list (quote quote) x)))))

このコード、実行結果が、以下のコードと同じなのです。
つまり、自己言及とかそういう可能性を秘めたコードなのです。
いやー、プログラムって本当に面白いですね。
(参考) http://www.nyx.net/~gthompso/quine.htm

ニセScheme置き場作りました。

http://wiki.livedoor.jp/mahalkita/d/%a5%cb%a5%bbScheme%c3%d6%a4%ad%be%ec

今後やりたいこと

  • 継続をサポート(難易度:高)
  • 関数名とかをSchemeと同じにする(難易度:低)
  • 末尾再帰を最適化(難易度:高)

買っちゃいました。

ベストアルバムだから、26曲中4曲しか新しい曲が無い。
そのうち3曲が再録音とかで、本当の新曲は1曲しかないけど、買っちゃったよ。
やっぱいいねー。DVDはこれから見る予定。


それはそれとして、問題なのはiPodでどう管理するかだなー。
ベストアルバムは既存のアルバムとトラックがかぶるわけだから、
二つともプレイリストに入れるのはディスク領域を無駄に使ってしまうから避けたい。
アルバム単位で再生する場合は、両方のアルバムから参照したい。
その一方で、再生回数は二つに分かれず同じトラックとしてまとめてカウントして欲しい(聞いてる側からすれば、それは同じトラックなのだから)。
宿題 : iTunesで二つのアルバムから参照されるトラックって作れないのかな?