53年前には生まれてなかったので、ぜひ初体験を堪能したいです。
もう一つのJoy(3)
忙しい季節に突入しそうなので、ちょっとしたGUIを付けて公開しました。
もう一つのJoy(2)
OMetaに対応しました。まだ発展途上ですがとりあえず晒しておきます。
(Squeak3.9-final7067.image, Squeak VM070309J.app, OMetaで動作確認)
サンプル用意しようと思ったら動かなくなってたのでいったん消します。再度晒します。
http://itolab.com/software/joy/Joy-Base2.st
http://itolab.com/software/joy/Joy-UI2.st
こんな感じで使います。
|j| j := Joy new. j run: 'DEFINE fact == [dup null] [pop 1] [dup pred fact *] ifte.'. j run: '10 fact'.
ユーザーフレンドリーではありません。また実装しているコンビネータもかなり限られています。とりあえずの動作確認用です。
OMetaとMMetaの違い
OMetaでは先ほどの記事の通りではうまくいきません。MTestのスーパークラスをOMetaにした上で、
(MTest onString: 'a') apply: #test
とやると同じことができるようになります。
MMetaでは、
boolean ::= ‘true’ | ‘false’
のように文字列を直接書くことができていたのですが、OMetaではtokenを定めないとうまくいきません。
token :xs ::= <spaces> <seq xs>
というのをOMetaParserあたりからもらってきて、
boolean ::= <token 'true'> | <token 'false'>
とします。
Squeak版Meta(MMeta)について
id:squeakerさんからいただいたSqueak版Metaの使い方に関するメールです。公開してもかまわないとのことですので私が参考にさせていただいた部分を公開させていただきます。
(前略) match:with:というクラス側にあるメソッドがエントリポイントです。それ から、まずテキストからトークンの列を作り、それからそのトークン列をパー ズする、という形でパーザーを書きたい場合のために、parse:with:というメ ソッドも用意されています。 例えば、MMetaTokenizerのtokenというメソッド定義(の文字列)は (MMetaTokenizer sourceCodeAt: #token) string という式で取得できますが、 MMetaTokenizer match: (MMetaTokenizer sourceCodeAt: #token) string with: #tokenize という式を評価すると、この文字列を正しく分解して配列に収めた結果が得ら れます。一つのトークンだけ取り出す実験であれば、例えば MMetaTokenizer match: 'abc' with: #metaName としてもよいでしょう。#tokenを見ると、#metaNameは#tokenの一種であり、 #tokenizeを見ると、#tokenizeは、#tokenの0個以上の列である、と書かれて います。(どの生成規則も、規則内の最後のものを結果として返します。) match:with:の第一引数は、ReadStreamが作れるコレクションなら何でも良 いので、Stringでなくても良いです。 MSqueakParser2の場合、 MSqueakParser2 match: '3 + (4 * 5)' with: #expr を評価すると、独自の構文木が得られます。 独自のパーザーを書く場合は、例えばまずはMTokenizerのサブクラスを作り (インスタンス変数はいらないので以下のように): MTokenizer subclass: #MTest instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Meta-Examples' そこで生成規則を定義してみます。普通のメソッドを定義するようにブラウザ に書けばよいです。例えば、 test ::= $a | $b と書いてacceptすると、testという生成規則が定義できます。ここですでに実 験ができるので、Workspaceに、 MTest match: 'a' with: #test と書いて評価すれば$aが結果として返り(orを表す'|'はどちらかマッチしたものの 結果を自分の結果として返すので) MTest match: 'b' with: #test であれば、$bが結果として返ります。 MTest match: 'c' with: #test であれば、失敗を表すnilが返ります。すべての生成規則は、失敗を意味する ためにnilを返すという約束になっています。 このようにして徐々にテストして行くやり方で、比較的大きな文法も少しず つ作っていくことができると思います。 -- Yoshiki
いつもお忙しいのに丁寧に教えていただきありがとうございました。
メールの通りにJoyParserというクラスを作り、小さな生成規則を作る→試すということをボトムアップ的にやったら数時間で完成できました。自分的にはかなりラクチン&楽しい作業でした。
もう一つのJoy in Squeak
d:id:propella:20070715:p1で出遅れてしまったJoyですが、ようやくマイJoyを作るところまできました。といっても3日仕事なので途中までしかできていません。
ちょっと思うところあってJoyの勉強をしはじめ、オリジナルのソースを眺めながらあれこれと処理系を作ってみました。特徴としては
- 将来のことを考えて(?)再帰的に実装してない。
- パーサにMMeta
OMetaを使った。
くらいです。作りとしてはminiscmをマネました。
MMetaOMetaについてはかなり以前にid:squeakerさんから丁寧な説明のメールをいただいたままにしていたのですが、アドバイスに従って作ってみたらあれよあれよとパーサができてしまいました。
パーサを作る段になると気分が滅入ってくる身としては本当にありがたかったです。
Squeak+MMetaOMeta万歳。
Joyのソースはもうちょっと体裁を整えたら公開します。
追記:OMetaとMMetaを混同してしまってすみませんでした。
教育力の向上
ここ数年、自分の教育力に大きな疑問を持つようになってきました。教育力の向上のために教員同士の授業参観のようなものもあるのですが、やはり同僚相手では構えてしまったり分野がかなり離れてしまっているせいかうまくいってません。
関係する分野で尊敬する先生が行っている授業を受けたいと思っていたところ、ちょうど良いことに比較的気軽に参加できそうな形態の大学が出来たのでさっそく科目等履修生として受講しようと思いました。
タイミングがずれて応募はできなかったのですが、当の先生に次回募集での受け入れをお願いしたところ激しく拒否されてしまいました。うーん残念。
受け入れていただけると本当にありがたいのですが…
GEMSキャンセル
宮坂先生のところのGEMSワークショップを家庭の事情でキャンセルすることになってしまいました。
http://mts-j.hiho.jp/2007/09/post_12.html
今年は忙しくなかなか外(=県外)に出られなかったので、このワークショップへの参加を楽しみにしていたのですが本当に残念です。また、急なキャンセルでご迷惑もかけてしまいました。
本家のサイトでも催しているので時間が調整できたら別途参加しようと思います。
初志不貫徹
一度決めたことを最後までやり通せずに終わってしまうことが多くなったような気がします。個人的な事情も絡んでいるのですが、今までの経験上、後悔するハメになることはよくわかっているのですが。
予期しないエラー
debian化したUSL-5Pでsambaの設定は無事おわり、netatalkの設定をしました。iBookから接続したら予期しないエラーが発生してマウントできません。
パスワードダイアログやマウントボリュームの選択まで行くのでnetatalk関連の設定ではないようです。表示されるエラーは「エラーコード -5014」というものでネットをいくら探しても該当するエラーが見つかりませんでした。
仕方がないので一度USL-5Pを再起動したら接続できるようになりました。しかし今度は復旧したはずのフォルダが見えません。これは単にUSB接続のHDDが自動マウントできなかっただけだろうと思い、手動でマウントしました。
再度iBookから接続しようとしたらやっぱりマウントできません。
怪しいとおもって接続するボリュームのルートにある.AppleDB.AppleDoubleフォルダを削除したら無事に接続できるようになりました。やれやれ