なんか、色々と古臭いのに、処理系のヘルプを読む限りJITコンパイルをしてるみたいです。逆に意味が分かりません。20日目のためのエントリです。)SquirrelとIconでLISPを作りました。今年の春、訳あって42個のプログラミング言語でLISP処理系を実装することになりました。これはその33〜34個目です。Squirrelはゲーム用のいわゆる組み込み言語です。Luaと同様の用途と聞いてそれなら簡単に違いないと思って使いました。IconはWikipediaで見つけ、面白そうだったので選びました。マニュアルを見ると分かりますが、びっくりするくらいコンパクトな言語です。外観Squirrelのプログラムはこんな感じの見た目をしています。テキトーに書いても動くやつです。何も考えずに口を半開きにしてヨダレを垂れ流しながらでも書けるような簡単な言語です。やったー!標準入力の罠しかし、標準入力から一行取得しようとしたところでいきなりハマりました。そんな関数がライブラリにないのです。それどころか標準入力から一文字読み込むという関数もありません。使えそうなのはSquirrelのプログラムをロードするという関数。「シェルスクリプトと上手く連携させてユーザが文字列を入力するたびにファイルに書き込んでそれをロードして......」などと複雑なものを書き終えた後に、Squirrelの文字は8-bit整数で、標準入力から8-bit整数を読み込むとで文字の読み込みができる事に気付きました。文字列の取得は戸惑いましたが、あとはマニュアルをほぼ読まずにテキトーに書いても、ほぼ想像通りに動いたのであっという間にLISPが完成しました。Squirrelはエラーメッセージが貧弱で分かり難いという問題点もありましたが、ほとんどエラーに遭遇しなかったので今回はあまり問題にならず。42言語中、もっとも早くLISPが完成しました。つくのでbegin/end系の言語かと思いきや、ブロックは中括弧{}で表します。retendあと、久しぶりに連想配列でLISPのデータを表す方針を取りました。呼ばれる機能でしょう。二種類の値を取り、式の一部が失敗したらその時点で全体が失敗します。Wikipediaには次のような例が載っています。成功し続ける限りそれを繰り返します。EOFを読み込むと失敗するので、そのときは「式の一部の失敗」となり、writeが呼ばれる前に式全体が失敗し、ループが終わります。私のLISPでも同じ仕組を使ってみました。面白い機能だとは思うのですが、簡単なLISPを作るくらいだと使いドコロがほとんどなかったのが残念で仕方ありません。暇があればもっと色々と遊んでみたいところです。あとIconの日本語版Wikipediaはあまりにも間違った記述が多いので英語版を読むことをおすすめします。ような書き方ができます。(end-1番目の要素まで含む。この1-originとexclusiveの組み合わせはどうも違和感があります。組み合わせだと私の直感が言っています。inclusiveだとサイズ0のrangeを表現できないのでIconはexclusiveにしたのではないかと思いますが、それなら0-originにして欲しいです。いうのもちょっと違和感があります。何はともあれ型を書かなくて良い言語は最高だと思いました。