iPhoneはオープンになるのか
携帯をiPhoneに切り替えて結構たつが、実にクールである。
いくつか気になる欠点はあるのだけれど、それも忘れてしまうほど圧倒的な完成度である。
しかしながら非常に大きな欠点が一つだけある。
アプリケーションの配布がオープンでないことである。
オープンな競合が無ければ、それほど欠点とも思わないかもしれないが、google phoneがある。
goolge phoneが本格始動してくれば、apple vs microsoftの構図がまた繰り返されるのではないだろうか。
iPhone(mac)はあこがれるけれど、たくさんソフトがあってみんな使っているgPhone(windows)を使うことになるのよねぇ。とか。
jijiスケッチ
1000行くらい。quasiquoteの実装半ば。バグだらけ。
JavaScriptの作法が分からないうちに書き始めたから、へんてこ。
といういいわけをしてもしかたがないほど恥ずかしいが、休日に書いてみたものを下記に出してみる。
評価のタイミングを整理できていないので、そこが一番直したいところ。
あまりにもシュールなページなので、時間見つけて適宜修正予定。
http://strobolights.homeip.net/kiki/jijitest
ドキュメントは皆無。まだスケッチだし。
嫁のあいてとかしないといけなく、最後の休日は何もできそうにない。。
quasiquoteがないにも関わらず、define-macro (mac)は一応動くかもしれない。
コメントの読み飛ばしを実装してない。。そういえば。。
biwaSchemeは素晴らしいなぁそれにしても。arc lightとか。
;;;; 試せるコード例 (def x 10) x ;; => 10 (def (fn1 x) (+ x 10)) (fn1 5) ;; => 15 (def (acm1 x) (fn (y) (= x (+ x y)))) (def tmp (acm1 10)) (tmp 10) ;; => 20, 30, 40,,, (mac (myif x y z) (list 'if x y z)) ;; tadano if. (def x (table)) (= (x 'a) "hello") (x 'a) ;; =>"hello" ((($ "#stdin") 'val)) ;; => "((($ "#stdin") 'val))" ((($ "#memo") 'text) "hello jiji") ;; => 書き換え。 ;; メソッド呼び出しの構文はもう少し砂糖にくるみたい。。 (def x (js-new 'Object)) (= (x "hello") "world") (x "hello") ;; => world *1 ;; => 時間
*1:js-eval "Date"
悩みどころ
read関数がconsセルを返却する実装にしてみたが、JavaScriptの関数引数は配列なので、読み替え処理が無駄だ。
配列で保持しておいて、評価の際に遅延評価的に読み替える方がいいかどうかで悩む。
マクロでもやもやと
嫁の買い物とか初詣に付き合う間、Lispで悶々と考え事をしていた。
マクロの展開処理を記述している時に悩んでいたことを考え直している間に、あたりまえのことに気づいた。
Lisp1で古典的マクロは問題があるという認識であったが、関数とかシンタックスとかマクロ自体を自己評価可能なオブジェクトにしておけば、簡単に回避できる気がする。
(mac (aif test1 then1 else1) `(let1 it ,test1 (if it ,then1 ,else1)))
という感じで書いていたが、
(mac (aif test1 then1 else1) `(,let1 it ,test1 (,if it ,then1 ,else1)))
と書けば、let1とかifがsyntaxとか関数とかマクロに評価されるので、レキシカルに定義を記述しておけばモジュール化可能な気がする。
あとは、複数のモジュールにソースを分ける際に、他のモジュールから変数をインポートしたとして、その変数名が短いとコンフリクトしかねない。
そこら辺も解決してみたい。
汎変数2
読み替えて実行するような感じで実装してみたけれど、マクロ展開を先にやる必要がありそうだ。
特殊フォームとか、いまのところどこで評価させるかが統一感がなくて気持ち悪い。
処理系って結構むずかしいなぁ。