iPhoneはオープンになるのか

携帯をiPhoneに切り替えて結構たつが、実にクールである。
いくつか気になる欠点はあるのだけれど、それも忘れてしまうほど圧倒的な完成度である。

しかしながら非常に大きな欠点が一つだけある。

アプリケーションの配布がオープンでないことである。

オープンな競合が無ければ、それほど欠点とも思わないかもしれないが、google phoneがある。

goolge phoneが本格始動してくれば、apple vs microsoftの構図がまた繰り返されるのではないだろうか。

iPhone(mac)はあこがれるけれど、たくさんソフトがあってみんな使っているgPhone(windows)を使うことになるのよねぇ。とか。

まぁgooglemicrosoftほどセンスが悪いとは思わないけど。

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"

パッケージの実装方針について

continuationは、今のところあまり実装するつもりはないのだが、現在のレキシカル環境へのポインタを名前つきでグローバルなハッシュテーブルに登録できるようにしておき、

  • レキシカル空間を名前で指定して実行できるシンタックスを作る。
  • レキシカル空間で、外からアクセス可能な変数を、名前つきでエクスポートできいるようにする。
  • レキシカル空間を指定して、エクスポートされている変数にアクセスできるようにする。

と、パッケージの実装も楽だし、マクロでシュガーシンタックスを実装してしまえばなかなか便利なのではないかと思った。

やるべきではないとおもうが。

誰しも考えそうなことだが、クロージャの永続化とかってやるべきではないのだろうけれど、シリアライズのやり方とかを工夫して、パフォーマンスを度外視すれば簡単にできそうな気がしてきた。
言語レベルでネットワーク透過性とか色々盛り込んでしまえば、継続ベースのサービスをコンカレントに提供できるかもしれない。

あんまいみなさそうだけれど、試しに作ってみるのもおもしろいかもなぁ。

マクロでもやもやと

嫁の買い物とか初詣に付き合う間、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

読み替えて実行するような感じで実装してみたけれど、マクロ展開を先にやる必要がありそうだ。
特殊フォームとか、いまのところどこで評価させるかが統一感がなくて気持ち悪い。
処理系って結構むずかしいなぁ。