(いまさら) Belについて簡単な紹介と処理系Niyarin
View Slide
BelとはPaul Graham氏のLisp系言語データの種類が少ない・Symbol, Pair, Char ,Stream・他のありがちなデータもこれらで表現コンパクトだが、継続やマクロがちゃんとある・実装はたのしめると思うレキシカルスコープ、lisp-1公式は処理系を出していない・ただし、コアの部分さえ実装すれば動かせる・残りの部分はbel.belとして提供されている
せっかくなのでArcについても (Wikipedia程度の情報)Paul Graham氏のLisp系言語Belの前に開発されていた実用的に使われた実績があるHacker Newsのweb formとフィード (今はどうなのか不明)ArcのフォーラムRacketで実装コアが小さい (bel同様)
Belを読む (http://www.paulgraham.com/bel.html)bellanguage.txtbelのコア言語の”カジュアル”な定義bel.bel拡張関数、マクロや数値の定義belexamples.txtちょっとの例
Belと既存のLispの慣習・ 空リストはnil。偽でもある。ただし、nilはシンボル・非真性list有り・ car, cdrはそのまま。 ペアの変更は、xar, xdr・condがない代わりに、 (if a1 a2 a3 a4 … an)・ lisp1、レキシカルスコープ・伝統的macro (風)
Belのデータ表現1 / 3 関数もリストこんな表現(lit clo ローカル環境 引数 本体)・ closureを作る構文は、quasiquoteで書かれている・ 例((lit clo nil (x) (+ x 1)) 100) → 101⚠ lit構文は、自身をそのまま返す
Belのデータ表現2 / 3 マクロもリスト表現(lit mac クロージャ)よくある、クロージャに式を渡して展開する やつ(クロージャ 式) eval→ 展開結果 eval→ 実行結果
Belのデータ表現3 / 3 その他数値もリスト 0,1,2,3,4 ...→ nil, (t), (t t), (t t t), (t t t t) …文字列もリスト“abc” → (\a \b \c)空リストと”真”はシンボルnil t
継続もある・ ccc”構文”で作れる・もちろん継続もリスト表現の形式は実装者依存 niyarinは、(lit cont コールスタック ローカル環境)⚠ インタプリタのコールスタックを陽で持っておく・dynamic-wind風の構文、afterもある継続で外への脱出を検出し、その前に指定した処理を実行させる
Belで実用的なコードを書けるのか?がんばればいける・ (coin) 関数ランダムで t , nil を出す・ (sys ) 関数の内容をOSに実行させる・ (thead x) 構文xを評価する新しいスレッドを作る・ IOstreamデータがある。ただし、バイナリしか読めない
Belは処理系実装の題材としては良い評価器はコンパクト4種のデータと16個の関数と9個のsyntaxquasiquotebel.belを実行するためのいくつかのsyntax-sugar処理系実装が楽しめる要素マクロ、継続、継続の捕捉、動的束縛、quasiquote題材は良いが、テキストの抜けを自力で埋める必要がある
実装・ bel-sml (github.com/niyarin/bel-sml)niyarinの”未完成”の実装Standard MLで書かれた素朴なインタプリタ気合をいれればすぐできそうだが、さぼってました・他の人の実装ほとんどインタプリタ (ぱっと見、それ以外は発見できず) luksamuk/believe (C), masak/bel (Perl), ajlopez/beljs (JS)cookrn/babybel(Ruby) ,
その他実装IGJoshua/skitter (Clojure)bel-likeと謳っているが何が違うのだろうBranislavLazic/belllが一個多かった。別言語だったよ (Lispだったけど)
おしまいまとめBelはコンパクトで自己記述がおもしろい言語継続とかあって実装は楽しい公式の実装はないけど、実装はたくさんある