こんにちは。
今回は、プログラミング言語「Shakespeare」を紹介します。
一風変わったプログラミング言語シリーズ (?) の3つ目です。
プログラミング言語「Piet」を使ってみる - プログラミングの備忘録
プログラミング言語「Uiua」を使ってみる - プログラミングの備忘録
目次
「Shakespeare」とは
Shakespeare (The Shakespeare Programming Language) はプログラミング言語のひとつで、オースルンドさんとハッセルストロームさんが開発されたそうです。
(どうでもいいですが、名前に Å や ö が入っていて the 北欧という感じがして良いです。)
Shakespeare という名前はあのウィリアム・シェイクスピアに由来しており、「コードがシェイクスピアの演劇に見えるように」というコンセプトがあるとのこと。
割と自由度が高く「演劇」という体をとっているので、文才というかセンスが問われるような気がします。(私にはありません。)
仕様
The Shakespeare Programming Language の内容を要約していきます。
演目
1文字目から最初のピリオドまでがタイトルとみなされます。
特別意味があるわけではなく、装飾のようです。
登場人物
続いて、登場人物を羅列します。
一人一人が変数としての役割を持つので、型宣言と似たような意味合いでしょうか。
(全て整数型のようですが。)
名前とその説明で構成されますが、説明文は無視されます。
名前は実際にシェイクスピアの作品に登場する人物でないといけないようです。
Romeo, a young man with remarkable patience.
幕と場
演劇を場面毎に分ける、幕 (act) と場 (scene) があります。
この前後で登場人物の入退場 (後述) を実行します。
各幕、場はローマ数字で番号付けし、その後に場面の説明が続きます。
(例のごとく、説明文は無視されます。)
Act I: Hamlet's insults and flattery. Scene I: The insulting of Romeo.
装飾的な意味もありますが、goto文 (後述) で飛ぶためのラベルとしても機能します。
登場と退場
登場人物がステージ上にいないと発言できません。
Enter
で入場、Exit
で一人の退場、Exeunt
で複数人の退場が可能です。
Exeunt
のみで使うと、全員退場します。
[Enter Hamlet and Romeo]
[Exit Romeo]
[Exeunt Ophelia and Hamlet]
[Exeunt]
発言
プログラムの本文にあたります。
「人物名: 発言内容」の形で記述していきます。
Hamlet: You lying stupid fatherless big smelly half-witted coward! You are as stupid as the difference between a handsome rich brave hero and thyself! Speak your mind!
(お分かりの通り、発言内容はちゃんと理解できるようなものにはなっていません。)
定数値について
各名詞がその良悪で 1 または -1 の値を持っています。
例えば、flower
や hero
は 1、pig
や coward
は -1 です。
名詞の前に形容詞を置くことで、値を2倍にできます。
例えば、lying stupid fatherless big smelly half-witted coward
では形容詞6つに -1 の名詞なので、$-64$ ($= 2^{6} \times (-1)$) を意味します。
演算について
足し算は the sum of X and Y
引き算は the difference between X and Y
かけ算は the product of X and Y
割り算は the quotient between X and Y
(ただし、整数型のみのため小数点以下切り捨て)
2乗は the square of X
3乗は the cube of X
値の代入について
値は話しかけられている人物に代入されます。
例えば、Hamlet
と Romeo
のみが登場している場面で
Hamlet: You lying stupid fatherless big smelly half-witted coward!
とあったら、you
にあたる Romeo
に lying stupid fatherless big smelly half-witted coward
($= -64$) が代入されます。
同じ状況で
Hamlet: You lying stupid fatherless big smelly half-witted coward! You are as stupid as the difference between a handsome rich brave hero and thyself!
であった場合、1文目で Romeo
に $-64$ が代入され、2文目で handsome rich brave hero
($= 8$) から thyself
にあたる Romeo
が減算されます。
つまり、Romeo
が $72$ になります。
(as 形容詞 as
の形も代入を意味します。)
出力について
open your heart
と speak your mind
の2種類があります。
前者では話しかけられている人物の値を数字で出力、後者では文字で出力されます。
例えば、先程の状況で
Hamlet: You lying stupid fatherless big smelly half-witted coward! You are as stupid as the difference between a handsome rich brave hero and thyself! Speak your mind!
となると、ASCIIコードで $72$ に対応する「H」が出力されます。
入力について
listen to your heart
と open your mind
があります。
前者では数を、後者では文字を対応する数に変換して受け取ります。
goto文について
let us return to scene III
のような発言があった場合、指定された場に移動できます。
let us
の代わりに we shall
や we must
、return to
の代わりに proceed to
を使えます。
(scene 間の移動は同じ act の中でのみ可能です。)
if文について
何らかの疑問文で条件を指定し、受け手の if so
や if not
とその後の発言で、真偽によって何を実行するかを決めます。
例えば、
Juliet: Am I better than you? Hamlet: If so, let us proceed to scene III.
なら、Juliet
が Hamlet
よりも大きかった場合 scene III へ飛びます。
比較について
is X as 形容詞 as Y
で X == Y
is X better than Y
で X > Y
is X worse than Y
で X < Y
を意味します。
否定を考えたければ、not
をつければ良いです。
スタック
登場人物が覚えられる整数は1つだけはなく、整数型の箱とスタックの2つを持っています。
値のプッシュは remember
で、ポップは recall
で可能です。
例えば、
Romeo: Open your mind! Remember yourself.
とあれば、話しかけられた人物は入力を受け取り、その値をスタックに入れます。
Romeo: Recall your unhappy childhood. Speak your mind!
とあれば、スタックからひとつ取り出し、対応する文字に変換して出力します。
(recall your
の後に続く単語は装飾で、特に意味はありません。)
実行環境
コマンドプロンプトで
いろいろ書いてあります。
The Shakespeare Programming Language
Write code inspired by Shakespeare with esolang | Opensource.com
が、ややこしそうだったのでやめておきました。
python のパッケージとして「shakespearelang」というものもありました。
pip install shakespearelang
を実行すればインストールされます。
(あらかじめ python を入れておく必要がありますが。)
実行にあたっては、コードファイルのあるフォルダでコマンドプロンプトを起動し
shakespeare run ファイル名.spl
と打ち込むことで実行結果が表示されるはずです。
しかし、「readline」モジュールが足りないと言われ、インストールしようとしても windows に対応していないみたいなことを言われてしまったので、結局諦めました。
ブラウザで
探したらありました。
まとめ
以上、Shakespeare を紹介しました。
解説を書いていたらそれで力尽きました。
パッと見は難解ですが、仕組みがわかってしまえば意外と読めます。
むしろ適宜ラベルをつけていくのでやりようによっては可読性が高い方…?
コーディングもやってみましたが、私は凝り性みたいな性分があるのか、ちゃんと成立した文にしようと考えてしまってやたら時間がかかってしまったので、あまりこの手の言語は向いていないかもと思いました。
最後まで読んでいただいてありがとうございました。また次回。