Logo実装中

実は、ここんとこ Python で Logo 実装しています。

カッコの無い世界 - みねこあ の流れで取りあえず 「正規Logo」から作り始めて 「カジュアルなLogo」に拡張していけば楽勝かなぁ、と思ったのですがどうしてどうして。そう単純にはいっていません。

鬼っ子1 if

Logoの テストは 「テストボックス」というのと「Ifオペレータ(Ifコマンド)」の2通りあります。

前者は Test 〜 IfTrue [〜] IfFalse[〜] というなんだか Smalltalk を彷彿させる書式で(時代的には逆ですが)それぞれが別コマンドになっています。こちらは Test結果をいずこかにスタックしておけばよいだけなので、どうてこと無いです。

しかし、Ifオペレータのほうは、結構食わせ物でした。Ifオペレータは、If〜 [〜][〜] という書式で、二つ目のリストが elseブロックなのですが、省略可能になっています。

ということは、あるコマンド(オペレーション)がかならず固定長の引数を持っていることを前提に構文解析する Logo の仕組みからすると結構致命的です。(ううっ・・・特別扱いしないとだめだぁ)

鬼っ子2 中置演算子

正規 Logo は Lisp のように 算術演算子を特別扱いせず 前置なのですが、しかしカジュアルなLogoでは 中置の四則演算子を持っています。カジュアルなLogo から 正規Logo へコンバートする際に A + B を見つけたら SUM A B に変換すればいい・・・という単純な話で気楽に考えていたのですが、よくよく考えればそんなはずはなく、A に入るのが、単なる数値だけでなくオペレーションである可能性がある以上、ちゃんと構文解析しないとダメでした。(当たり前じゃん)


と、まぁ、お手軽プログラミング言語処理本とLogo - みねこあ で目論んだ 再帰降下解析に優しい文法という幻想はもろくも崩れ去りました。(else省略可能な if に 中置算術演算子なんて、典型例も良いところ)うまい話はないものよのぉ・・。

作ってみて感じたのは、確かに最初は シンプルなルールで Lisp から カッコを取り去ったものがLogoだったんでしょうけど、そこから 言語のシンプルさ(美しさ)が犠牲になっても、ユーザーに使いやすいように改造していった果てに今の Logo になったのではないか、と言うこと。Lispの眷属にしては、構文に例外が多いと感じます。まるで普通の手続き言語みたい。

また、ダイナミックスコープに代表される古典的だけどシンプルな言語というイメージは、残念ながら(?)虚像だったようです。Catch n [〜] と、Throw n コマンドによる例外機構など、なかなかくせ者も居て、やっかいです。

こうなってくると、Logo の言語仕様が欲しくなってくるのですが、タイムリーなことにカッコの無い世界 - みねこあにいただいた ドリトルの兼宗さんのコメントによると

LOGOは正式な言語仕様がないので方言が多いです。

とのこと。みゅ〜、

川野さんの本は良書ですが、これもひとつの方言だと思います。

だそうなので、これは「猫ロゴ」だよっ、と割り切っちゃえばいいのかな?