jiji残件

Lisp on JavaScriptの残件。あーもう金曜日だ。
つらいなぁ。休日が終わる。

  • 汎変数まわり。set!でsetf的動作をさせないと。
  • 適用可能オブジェクト化。ハッシュとかarrayを適用可能オブジェクトにすると、Javascriptと親和性いいかも。$("xx").text("hello")とか、そういう記述がおおいからなぁ。でも悪い副作用ってないんだろうか。そしてLisp的には気持ち悪いのだろうか。場所によって評価方法が変わるのが気持ち悪いと言えば気持ち悪いけれど、Lisp2でも場所によって評価方法が変わるから、いいような気もする。)
  • jquery apiの取り込み。
  • emacs的なものをwebで作る。
  • emacs的なもののバックエンドをwebアプリとして作る。
  • emacs的なもののバックエンドのフロントエンドとして、emacs上のプログラム、あるいは何がしかのものを作る。

古典的マクロ実装完了

こんなに簡単にいっていいのだろうか。
コンパイルフェーズをどう入れ込むかで頭がパンクしそうだが、なんだか一発で動いたっぽい。こんなんでいいのか。

jiji>
(def z 1000)
1000
jiji>
(def mc1 (mc (x) (list + x z)))

jiji>
(mc1 10)
1010

今度はsicpのanalyzeフェーズを入れてみよう。

コンパイルと実行のフェーズわけとか、そこら辺はなんだかややこしいなぁ。

ところでメンテナンス性がいいかなぁとデータ主導型でeval,applyを実現しようと思って、javascriptのprototypeオブジェクト指向をバリバリと使ってみているんだけれど、返ってややこしくなってしまったかもしれない。

writeとか、単純な出力ならメソッドで実現できるんだけれど、リストのドット表記とか、略式表現とかを実現しようと思ったら、外側の関数で制御する必要があったり。

どうするべきなんだろう。

今回のLisp on javascriptはjijiと命名しているのだけれど、jijiのオブジェクトはjsのオブジェクトをラップする独自のオブジェクトで動いている。
これはいいのかわるいのか。。
jsのオブジェクトに無理やりメソッドを追加していけばいい気もするのだけれど、jsの世界に影響を及ぼすのは若干気が引けるしなぁ。。

古典的マクロ、末尾再帰最適化、Lisp2化、web用のrepl

古典的マクロってどうやって実装するのか。
コンパイラフェーズで評価すればいいのかなぁ。
その際の環境をどうするべきかとか、ちょっと考えないとなぁ。

末尾再帰最適化もやりたい。

Lisp in small peacesとかいう本がどっかに転がっているはずなんだけれど、
本が多すぎてどこにあるのやら。。

うーん。Date以外で動くからとりあえずいいかなぁ。

使ってみて不便だったら直す方向で。。

function js_new (fn, arg) {
    var ins={};
    ins.__proto__=fn.prototype;

    var ret=fn.apply(ins, arg);
    if (ret instanceof Object) {
	return ret;
    }
    return ins;
}

Lispからjavascriptのオブジェクトを生成したい

javascriptのnew演算子をwrapするところで詰まっている。

  new TestObj(arg1, arg2)

というのをメタプログラムしたいのだが、関数呼び出しの場合であればFunctionオブジェクトにapplyメソッドが用意されているので、簡単なのだけれど、new演算子の場合は、いかんともしがたい。

http://nanto.asablo.jp/blog/2005/10/24/118564

などを参考にしてみたが、自作オブジェクトだとうまく動くが、組み込みのDate型のインスタンスを生成してみると何やらうまく動かない。
toStringやvalueObメソッドが、Date型のオブジェクトから呼び出されていないという文句を言ってきた。
__proto__をみても、正しそうだし、instanceof Dateでもtrueを返す。

うーん。spidermonkeyのソースとかみるしかないのだろうか。
それとももう少しECMAとかjavascriptの仕様に潜るか。

javascriptで俺Lisp

休みの間に、javascript上で動作するLispと、自分用のwikiを作っておきたい。
まずはjavascript上のLispを実装してみた。
javascriptapiをほとんどそのまま呼び出せて、+αでマクロが使えると便利かなぁと思っていたので、ゴチャゴチャ実装してみたが、なかなかjavascriptとの接続部分が綺麗にいかない。

まぁ、色々書いてみないと、よく分からないので、もう少し没頭してみよう。