KEMURI
第39回情報科学若手の会の夜のセッションでのディスカッションから生まれた言語「KEMURI」を紹介します。
これはKEMURIで「Just Another Python Hacker,」と表示するコードです。
KEMURIはスタックマシンです。 スタックには0~255の値が積まれます。 1つの文字が1つの命令になっています。命令は全部で6つです。 「^」はスタックから2つの値を取り出し、XORを計算してスタックに積みます。「"」はスタックから1つの値を取り出し、その値を2つ積みます。つまりスタックの頭からxyzの順で並んでいたらxxyzにします。 「'」はスタックから3つの値x, y, zを取り出し、x, z, yの順で積みます。つまりスタックの頭からxyzの順で並んでいたらyzxの順に並び替えます。 「~」はスタックから1つの値を取り出し、NOTを計算してスタックに積みます。 定数値をスタックに積む唯一の命令は「`」で、これを実行するとスタックの上から順に「72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33」という値が入ります。 「|」はスタックの中身を標準出力に出力します。基本的にプログラムの最後で1度だけ使うことを推奨します。
「Hello, world!」と出力するコードは下のように簡潔な物になります。KEMURIはHQ9+に次いで2番目に「Hello, world!」を短く書ける言語です。
`|
NOTを使わずに、0~127の任意の文字を出力できることが知られています。
コーディングのコツ。 「"^^」でスタックの頭の1つの値を捨てることが出来ます。「^"^^」で2つ、「^^"^^」で3つ捨てることが出来ます。「'^"^^」で1番上の値を捨てずに2番目、3番目の値を捨てることが出来ます。
「l」(小文字L)と「*」(アスタリスク)は将来的に「スタックの中身をBrainf*ckとして実行」という命令に割り当てる可能性のために予約されています。(KEMURI_PLUS)
Pythonで書かれたKEMURIのインタープリタを下に掲載します。
class Kemuri(list):
def push(self, x):
self.append(x)
def do(self, com):
if com == "~":
self.push(~self.pop())
elif com == "^":
x = self.pop()
y = self.pop()
self.push(x ^ y)
elif com == '"':
x = self.pop()
self.push(x)
self.push(x)
elif com == "'": # xyz => yzx
x = self.pop()
y = self.pop()
z = self.pop()
self.push(x)
self.push(z)
self.push(y)
elif com == "`":
s = list("Hello, world!")
s.reverse()
for c in s:
self.push(ord(c))
elif com == "|":
result = ""
while len(self) > 0:
result += chr(self.pop() % 256)
print result
elif len(com) > 1:
for c in com:
self.do(c)
return self
def inter(self):
while True:
code = raw_input("KEMURI> ")
if code == "":
break
self.do(code)
if __name__ == "__main__":
Kemuri().inter()