Arcを使ってみる

ArcのベースではMzScheme(v352)を使ってるようだ。

まずはdefと=の関係を試す

arc> (def func (a) (+ 1 a))
#<procedure: func>
arc> (func 1)
2
arc> (= func '(1 2 3))
(1 2 3)
arc> func
(1 2 3)
arc> (func 1)
2
arc> func
(1 2 3)
arc> 

名前空間は分けられる風ではあるのだが、そうでもない。単一の名前空間。ブクマコメでのyharaさんの指摘のとおり、二つ目の(func 1)は、('(1 2 3) 1) => 2になっていたようです。

つづけてfuncに関数を代入すると、

arc> (= func (fn (a) (+ 10 a)))
#<procedure: func>
arc> (func 2)
12

とdefで定義した関数が呼び出せなくなってしまう。


マクロ定義はCommon LISP

(mac n-of (n expr)
  (w/uniq ga
    `(let ,ga nil
       (repeat ,n (push ,expr ,ga))
       (rev ,ga))))


あとループがあったり、booleanがtとnilになっているとかCommon LISPっぽい部分が多い。
感想としては、「かなりLISPぽいプログラミングができるScheme」というかんじかなあ。

arc> (w/uniq ga ga)
gs1429
arc> (coerce 'a 'string)
"a"
arc> (coerce "a" 'sym)
a
arc>


ベースのPLT Schemeにはこういう話もあるんで逆を進むような感もあるけれど。