プログラミング言語
Esolang
Pxem

【個人的雑記】Pxemの文法を見出そうとしてわかったこと

この記事では、Pxemという、ぬこ氏考案のプログラミング言語のインタプリタを再作成するにあたって、わかったことを記述するだけである。

Pxemについての本家ページの記述

このページを参照されたい。

Pxemの文法について

Pxemでは、ファイル名をもソースコードとみなされるため、ファイル名だけでプログラミングが可能である。そこで、以下にPxemについて分かったこと(またはそうだと思われること)を羅列する。

ファイル名優先

例えば、

HelloWorld!.p.d.pxe
._.wNot Zero.d.aZero.d

というファイルがあるとする、この場合、HelloWorld!.p.dという部分が最初に行われるが、途中、.dに達した時点でファイル内部の._.wNot Zero.d.aZero.dという部分が実行される。その部分が終わるとファイル名に戻り、.pxeの部分が実行される。

ちなみにこのファイルの具体的な動作は、

  1. "HelloWorld!"と出力する
  2. 整数を入力する
  3. ゼロだったら"Zero"、そうでなければ"Not Zero"と出力する
  4. 終わる

となる。多分。

最後の「.pxe」や「.pxem」の「.p」の部分も命令

本家サイトでは、

pxem:Hello, world!.pxe

42.pxe

が紹介されていた。それぞれ"Hello, world!"や"42"と出力するのだが、どうやら拡張子の部分である.pxe(または.pxem)もソースコード扱いのようだ。

命令は大文字でも小文字でも可

本家ページには、FizzBuzzを出力するプログラムがあり、それは

ak.-akbuzz.-ak4.-akfizz.-ak2.-1.p05.-.tab.z01.-.c.m.+.c.t05.-.%.w.s01.-.m03.-.%.W.s.m.nak.-.p00.-.c.c.c.a.wak.-fizz.p00.-.c.c.a.a.w01.-.m03.-.%.w.sak.-buzz.p00.-.c.c.a.wak.-fizzbuzz.p00.-.c.a.a.md2.-02.-.!.a.d.pxe

というふうに書くことで実現できる。

よく見ると、この中に.Wが紛れ込んでいる。次の「分岐系命令は始まりと終わりの数が一致する必要がある」が存在するとすれば、上記のコードには、

  • .a7個
  • .wが5個
  • .x.yが0個
  • .zが1個
    • .w.x.y.z合わせて6個

となり、ドットと小文字の組み合わせの文字列だけを数えると後者のほうが1個足りない。しかし、大文字である.Wを含めると7個で、数が一致する。

もしかして、本家ページがこう書いていたということは、命令は大文字でも小文字でもいいという仕様があったのではないか?

分岐系命令は始まりと終わりの数が一致する必要がある

ここで、上記の5つの命令について説明しよう。

  • .w.x.y.zはスタックから値を一つ(.w以外は二つ)ポップして、それらがある条件を満たしていれば(または満たしていなければ)対応する.aの次の文字から読み続ける。
  • .aは対応する.w.x.y.zから読み直す。

という内容である。

本家ページにおいて紹介されているサンプルコードを見てみると、条件分岐を用いたものは上述のFizzBuzzの他に、

(以下はechoプログラムらしい)

1.w.o.i.c12.-.+.a.s.pxe

(以下はDelete Last Lineらしい)

1.w.i.c12.-.+.a1.zak.-.a.v.pxe

が紹介されていた。これらはすべて、上記の「分岐系命令は始まりと終わりの数が一致する必要がある」という規則を満たしているようだ。

分岐系命令でもしもスタック内部の要素数が足りないと?

これは今まで私が誤解していたものである。

前述の通り、

  • .w.x.y.zはスタックから値を一つ(.w以外は二つ)ポップして、それらがある条件を満たしていれば(または満たしていなければ)対応する.aの次の文字から読み続ける。

とあるが、もしもスタックが空だったり要素が1個しかない場合はどうなるのだろうか?本家ページには、

スタックの中身が空ならば、条件判断は行われない。

スタックの中身が2個未満ならば、条件判断は行われない。

と記述していた。私は今まで「スタックの中身が足りなければ条件判断もポップもせず、そのまま次の文字から処理を続ける」と思い込んでいた。

しかし、どうやら、違うようだ。

本家サイトには上述のEchoプログラムについて、こう記述があった。

まずスタックに'1'が詰まれるが、これは次の.wでループが抜けないようにするためである。

これは、もしかしたら、本当は、

.wを処理する際、スタックが空ならば対応する.aの次の文字から処理をする」というのが正しいのではないか。それならば同様に、.x.y.zの場合も、スタックが空ならば同様の処理をする」と考えても過言ではないのだろうか。

しかしながら、.x.y.zについて、困ったことがある。それは、それらの命令が「スタックを2回ポップする条件分岐系命令であるため、スタックの中身が一個のデータのみの場合はそのデータがポップされるかされないか」である。

当時のPxemインタプリタをお持ちの閲覧者がいらっしゃったら、是非そのことをコメント欄で教えてほしい。

最後に

この記事の閲覧に感謝する。

また、現在私が制作している最中のインタプリタのソースコードをこの記事に載せたいが、それがGitHubにあって、そのレポジトリへのリンクを貼るのはこのサイトではしてはいけないのだろうかと思い、敢えてリンクは貼っていない。もししてもいいと言うのであれば、お教えいただきたい。