Arc

ようやく出た例の言語。とりあえず未完成なんだけど使えるレベルになったので公開したということらしい。なんというか、非常にPaul Grahamらしい言語になっていて納得した。On Lispを読んだ人ならすぐピンとくる。

ざっとチュートリアル見た感じだと、Common Lispのエッセンスを持ちつつ文法を全部マクロで書き直したような印象。根本的にはCLだと思えば間違いないが、

  • 名前はわかりやすくできるだけ簡潔に、よく使うもの程短く
  • 自明な括弧を省く
  • 述語関数の否定形はnotを付ければいい

といったどこかで聞いたようなポリシーがひしひしと感じられる言語デザイン。lambda は確かに使用頻度に対して長いなぁ、と思ってたので fn になって良い感じ。

他に気になった点は、

  • 変数の代入オペレータが = とされ、これが実質setfなので自然に汎変数が使えるようになっている
    • (= (car '(1 2 3)) 10) で'(10 2 3)になる
  • (1変数)関数合成が関数名を : で繋ぐだけで実現できる
    • odd:car で、carに適用した結果をoddに渡す関数
  • 文字列が適用可能オブジェクトで、indexを渡すと文字にアクセス可能( = で代入もできる)
    • ("hoge" 0) で #\h が返ってくる
    • (= ("hoge" 2) #\m) で"home"になる
  • (table) ってやるとハッシュテーブルができる
    • 適用可能オブジェクトなので、keyを適用するとvalueが出る
    • 勿論そこに = で値を設定する
  • 1変数関数をブロックとして楽に書けるようになっている
    • [+ _ 10] で10を足す関数
  • リストをpush,popでスタックとして扱える
  • マクロ定義のとき、w/uniqで楽にgensymができる

あたりか。とにかくOn Lispに書いてあったようなことを楽にするために、CLのガワを(色々要素を取り入れて)作り直したというところやろうから、これは本人は使うわなぁ。そういうわけなのでマクロ関係はほぼCLそのまま。

個人的には汎変数を軸にうまく値の代入が表現されていて、中でも適用可能オブジェクトがうまくハマっているあたりに感動した。確かにLisp系言語って代入関係が弱い*1印象があったが、これはかなり補強されたと言っていいんじゃなかろうか。まぁ、他はぶっちゃけ名前の問題とかマクロの問題なので、そのあたりはかなり好みが分かれそう。俺は許容範囲やけど、一般的な用語から逸脱した短縮はしてるからなぁ。(make-hash-table)が長過ぎるのは理解できるが、(table)って…。やはり可読性は犠牲になってるなぁ。

*1:弱いというかぞんざいというか、汚い、低レベルなことをしないとできない感じ