squeakerのブログスマートフォン用の表示で見るsqueakerのブログこの広告は、90日以上更新していないブログに表示しています。2014-07-24J言語をOMeta2/Squeakで作る仕事?APLの集まりに参加した関係上、私も処理系の1つぐらいは作らなくてはな、ということで雑用に追われる中(実は転職しました)ちょっと作ってみました。実装の都合上、シンボルはAPLのシンボルではなく、ASCIIベースでやっているJ言語のものを使っています。実装に使う言語はOMeta2/Squeakで、パーザーとインタープリターをそれぞれ別のクラスとします。beating"とか)とは距離を置き、とにかく簡単な実装とすることを目標とします。パーザーはJParserというOMeta2クラスのサブクラスとして作ります。Jの実行単位は「文」と呼ばれているもので、それは簡単に言ってしまえば、「要素」の1つ以上の列です。文を認識する構文規則は以下のようになります。reversed]のようになっています。認識した結果は逆順にひっくり返された後、#sentenceというキーワードをあたまにつけたリストになります。ここで使われている要素を認識するためのelementという構文規則は以下のような感じです。name文を括弧でくくったもの、数字の2つ以上の並び、一つだけの数字、記号、そしてアルファベットで始まる普通の名前のどれか、ということになっています。それぞれ結果はあたまに適切なキーワードをつけたリストです。numberとかprimitiveとかの規則も定義はしなくてはいけないのですが、それらはまあ簡単なのでここでは省きます。いうわけで、sentenceとelementという規則を定義することによって、Jのパーザーが完成しました。3}}}}という構文解析の結果を出力します。次はインタープリターです。要するに入力を後ろからスタックに積んでいき、スタックトップの近くで還元できる要素があれば還元する、ということになります。OMeta2は要素の後ろの方を処理するという機能がないので、パーザーの方で順序をひっくり返していたのでした。インタープリターはJInterpreterというOMeta2クラスのサブクラスとして作ります。last]と書きます。sentenceキーワードで始まるリストの要素を全部見終わった後にもスタック上に還元すべき要素がまだ残っているかもしれないので、最後には還元できる間ループして(クリーネ閉包*を使う)、スタックトップを結果とします。n]というくらいのもののはずです。#arrayキーワードで始まる配列が来た場合は、JArrayというJの配列を表すオブジェクトを作ります。数値やシンボルなどは構文解析の結果そのもので良いです。上記のページを見ると副詞(adverb)や接続詞(conjunction)の結合規則について何やら書いてあります。構文解析時にバラバラのままにしておいた+や/のシンボルはどこかの段階で結合させなくてはならないようです。シフトしようとしたものが副詞や接続詞だった場合には、その時点で読めるだけ読んで結合したものを動詞としてシフトするようにします。丸括弧で囲まれていた副文であった場合にはそれを評価しなくてはならないので、それもシフト時にやってしまうことにします。n])例によってparseVerbやisInnerSentenceの定義は省きます。[n]のようなものです。いうわけで、後は必要となるヘルパーを書いて、パーザーとインタープリターの完成です。実際に計算を行う演算子の実装にはまだ手間がかかります。+や-といった2項演算子であっても、引数となっている配列の次元の組み合わせ、そしてランクオペレータの指定するランクによって振る舞いが変わってくるので、その辺に対処したものをSqueakのコードとして書きます。rr"のようなシグネチャのものとして書きます。このような演算子は副詞や接続詞によって際限なく修飾されうるので、Squeakのクロージャーを活用して、組み合わせることにします。br].のようにDyadという辞書にしまっておきます。4つ引数があるのは、2つの引数およびそれぞれの引数のランク情報を渡すためです。rr]].のようにDAdverbという辞書にしまっておきます。#'+')のようにすると、再び4引数のブロックが結果として返るので、それを2項演算子として使うことができるわけです。Squeakで作った以上、対話的な環境を作らねばなりませぬ。いうわけで、Workspaceのサブクラスを作って2,3のメソッドをオーバーライドし、入力したものがJの式として評価されるようなものを作ります。さらなる発展があるかどうかはかなり謎ですが、まあ記録までに日記にしてみました。転職しました月別アーカイブはてなブログをはじめよう!squeakerさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。