otoha

(2008/07/13 05:09:27 PDT)

Ypsilon

暇さえあればGaucheのソースを読んでいた時期のことを思い出しつつ
某所で知ったR6RSな処理系Ypsilonのソースを読んでみる。
ベンチマークの結果、GCの実装など興味深い。


(2008/03/03 08:12:04 PST)

Anarki:[]

オフィシャルの方のArcは、tar玉がポンと公開されるだけなので、ユーザー達は そのソースをコネコネしていろいろ試している。 []には拡張が入って、Gaucheのcutとpa$を合わせたものになっている。

arc> (macex '[_3 _2 _1 __])
(fn (_1 _2 _3 . __) (let _ _1 (_3 _2 _1 __)))
arc> (macex '[+ 1])
(fn gs1699 (apply + 1 gs1699))

[]の本体に`_'が現れない場合は部分適用になる。


(2008/02/22 15:07:38 PST)

構文糖

思えば、Schemeを覚えたのはArcのためだった。 今ではすっかりSchemeで考えるようになってしまって、Arc に馴染めない。 Arcには関数内関数をすっきり書けるように、rfn、afn、[... _ ...]などが 用意されてる。 SRFIにはrfn相当のrecがあるが、これって使いやすいだろうか? 使ってるコードをあまり見かけない。 もうnamed-letと内部defineに慣れてしまった。

;; これ、読みやすい?
(def set-array! (a tree)
  (let rec (rfn rec (rank lst idx)
             (if (is rank 0)
                 (<- (a (rev idx)) lst)
                 (let count -1
                   (each l lst
                     (rec (- rank 1) l (cons (++ count) idx))))))
    (rec (a 'rank) tree nil)))

(2008/02/13 07:23:47 PST)

Arc1

arc> =.a.1.b.2.c.3
3
arc> list.a.b.c
(1 2 3)

面白すぎる。


(2008/02/11 10:10:10 PST)

call/cc

gosh> (call/cc (lambda (k) (k)))
#<undef>
gosh> (call/cc (lambda (k) (k 'foo)))
foo
gosh> (call/cc (lambda (k) (k (values))))
#<closure #f>

うーむ、、、なぜクロージャが返るのかな?

gosh> (disasm (call/cc (lambda (k) (k (values)))))
main_code (name=#f, code=00AEAC00, size=5, const=0, stack=4):
args: #f
     0 VALUES(0)                ; (values)
     1 PUSH
     2 LREF0                    ; k
     3 TAIL-CALL(1)             ; (k (values))
     4 RET
#<undef>

(2008/02/06 17:30:18 PST)

Arcの[] 

一引数の手続きはよく使うから、こんな感じの手続き

(lambda (x) (+ x 1))

は、Arcでは

[+ _ 1]

と書けるそうですが。でも、、、Schemeでは、それと同じくらいwith-* 系の高階関数に渡すthunk

(lambda () body ...)

をよく使う。これを

[body ...]

こう書けたら幸せかも。一引数に限定しちゃうのかな?

More ...