本文へスキップ
totonoe.tech

難解プログラミング言語を整える

中級

Shakespeareを整える。

= 登場人物が変数、台詞が計算になる戯曲形式の言語を、舞台の上の値とスタックごと眺める

Shakespeare が初めての方は、先に そもそも Shakespeare とは をどうぞ。言語の紹介は エソラング図鑑のページ にもあります。

① 台本を入れる

サンプルを選ぶか、台本を書いて貼り付けてください。名詞・形容詞・人物名は、仕様の語彙リストにある代表的な語だけが使えます(一覧は下の解説にあります)。

サンプル(クリックで台本と入力欄に入れる)

台本(Shakespeare) 入力は実行するまでこの端末の中だけ

② 実行して出力を見る

入力を読む台詞(Open your mind / Listen to your heart)は、この欄の文字を先頭から順に読みます。尽きると -1 が読み込まれます。

終わらないループでも、1,000,000 文を超えたら自動で止まります。

出力

(まだ実行していません)

③ 舞台の上を1文ずつ見る

今の台詞がどういう意味か、人物の値とスタックがどう変わるかを、1文ずつ確かめられます。

台本(黄色が次に演じる台詞、灰色が今演じた台詞)

次の台詞の意味

今の結果

ここまでの出力

 

登場人物(枠が濃いのは舞台の上にいる人。数は値、右の並びはスタックで右端が一番上)

そもそも Shakespeare とは

台本のような見た目で、中身は整数とスタックと goto だけの言語。

Shakespeare Programming Language(SPL)は、Karl Hasselström(愛称 Kalle)と Jon Åslund の2人が2001年に作った言語です。大学の構文解析の授業の課題の最中に、「別の課題として自分たちの言語を作ろう」と夜更けに思いつき、3時間で骨組みができた、と仕様書の冒頭に書かれています。

設計の目標は、仕様書によれば「シェイクスピアの戯曲に似た、美しいソースコードを持つ言語」です。制御構造は goto だけで、データ構造にも凝らず、基本の算術と goto だけ、と書かれています。プログラムは題名・登場人物の紹介・幕と場・台詞の順に並び、変数にあたるのが登場人物です。

数の作り方が特徴で、名詞が 1 か -1(花は 1、豚は -1)、形容詞が付くごとに 2 倍になります。2 のべき乗を形容詞の数で作り、あとは「the sum of」「the product of」などで組み合わせます。人を褒める台詞は大きな正の数、罵る台詞は負の数になる、というわけです。

台詞は「足す」ではなく「決める」

「You are as good as …」は、言われた人物の値をその値にする(代入)文です。値を増やしたいときは、「Thou art the sum of thyself and a big pony.」のように、自分自身の値を式に含めます(thyself は言われた人自身の値)。③のステップ再生では、この違いが人物の値の変化として見えます。

何の役に立つのか

  • 変数・スタック・goto の最小構成を学べる

    言い回しを取り除くと、整数の変数・比較・条件付きの goto・スタックだけです。どんなプログラムも結局は何でできているかが見えます。

  • インタプリタ作りの練習題材になる

    語彙リストを使った構文解析、状態(舞台・値・スタック)の管理、ステップ実行を、小さな規模で一通り体験できます。

  • 「読みやすさ」を考え直すきっかけになる

    文章として読めることと、処理が追いやすいことは別です。日本語に近い書き方の業務ツールを見るときの視点にもなります。

  • 話のネタ・研修のアイスブレイクになる

    「ハムレットが豚と呼ばれてプログラムが動く」という画面は、プログラミングの導入で場が和みます。

このページが対応している文

仕様書にある文のうち、下の一覧のものを動かせます。仕様書のサンプル(Hello World・素数・逆順)はそのまま動きます。

  • タイトル.

    最初のピリオドまでが題名。飾りで、実行には関係しません。

  • Romeo, a young man.

    登場人物の宣言。人物=整数を1つ持つ変数で、使う人物は全員ここで宣言します。説明文は飾りです。

  • Act I: …. / Scene I: ….

    幕と場。ローマ数字で番号を振り、場は「飛び先の目印」にもなります。

  • [Enter A and B] / [Exit A] / [Exeunt] / [Exeunt A and B]

    人物を舞台に上げる・降ろす。話しかけられるのは「舞台にちょうど2人いる」ときだけです。

  • Romeo:

    ここから先の文は Romeo の台詞。「あなた(you)」は舞台にいるもう1人です。

  • You are (as good as) 値.

    相手の値を決める(代入)。「You are a pig.」のように as … as は省けます。

  • Am I better than you? / worse than / as good as / more 形容詞 than / not

    2つの値を比べて、答え(はい・いいえ)を1つだけ覚えます。

  • If so, 文 / If not, 文

    直前の問いの答えが合うときだけ、その文を実行します。

  • Let us proceed to scene II. / We shall return to act I.

    飛ぶ(goto)。場へは同じ幕の中だけ、幕へはどの幕へも飛べます。we shall / we must も可。

  • Speak your mind! / Open your heart!

    相手の値を、文字(文字コード)として/数として出力します。

  • Open your mind! / Listen to your heart!

    入力から文字を1つ/数を1つ読んで、相手の値にします。

  • Remember 値. / Recall …

    相手のスタックに値を積む/一番上を取り出して相手の値にする。Recall の後ろの言葉は飾りです。

「値」に書けるもの

  • 名詞(flower, pig, tree など)

    良い名詞は 1、悪い名詞は -1、中立の名詞は 1。

  • 形容詞 …… 名詞

    形容詞が1つ付くごとに2倍。「a big big pony」は 4、「a fat big pig」は -4。

  • nothing / zero

    0。

  • I / me / myself, you / thou / thyself / yourself

    話し手自身の値、聞き手の値。

  • 人物名(Hamlet など)

    その人物の値。

  • the sum of A and B / the difference between / the product of / the quotient between

    足す・引く・掛ける・割る(商。0 に向かって切り捨て)。

  • the remainder of the quotient between A and B

    割った余り。

  • the square of / the cube of / the square root of / the factorial of / twice

    2乗・3乗・平方根(切り捨て)・階乗・2倍。

このページの取り決め(仕様と違う・仕様にないところ)

  • 語彙は代表的なものだけです。人物名 152 件、名詞 79 件、形容詞 88 件で、リストにない語は文法エラーになります。
  • 値は 32 ビットの符号付き整数として計算します(大きくなりすぎると折り返します)。
  • 入力が尽きたとき、数も文字も -1 が読み込まれます。逆順サンプルは、この -1 を終わりの印にしています。
  • 舞台に3人以上いても Enter はできますが、「あなた」が誰か決まらないため、話しかける台詞はエラーになります。
  • 仕様書にない演算(たとえば「half of」)は入れていません。
  • 仕様書の本文にある例文「the difference between the square of the difference between my little pony and your big hairy hound and the cube of your sorry little codpiece」は、本文では 60 と書かれていますが、語彙どおりに計算すると 100 です(hound は悪い名詞なので -4)。このページは語彙どおりの 100 で動きます。
  • 実行は 1,000,000 文まで、出力は 20 万文字までで止まります。
使える語彙の一覧を開く

良い名詞(値 1)

angel / flower / happiness / Heaven / hero / joy / King / kingdom / Lord / plum / pony / rose / summer's day

中立の名詞(値 1)

animal / aunt / brother / cat / chihuahua / cousin / cow / daughter / door / face / father / fellow / granddaughter / grandfather / grandmother / grandson / hair / hamster / horse / lamp / lantern / mistletoe / moon / morning / mother / nephew / niece / nose / purse / road / roman / sister / sky / son / squirrel / stone wall / thing / town / tree / uncle / wind

悪い名詞(値 -1)

bastard / beggar / blister / codpiece / coward / curse / death / devil / draught / famine / flirt-gill / goat / hate / Hell / hog / hound / leech / lie / Microsoft / pig / plague / starvation / toad / war / wolf

良い形容詞

amazing / beautiful / blossoming / bold / brave / charming / clearest / cunning / cute / delicious / embroidered / fair / fine / gentle / golden / good / handsome / happy / healthy / honest / lovely / loving / mighty / noble / peaceful / pretty / prompt / proud / reddest / rich / smooth / sunny / sweet / sweetest / trustworthy / warm

中立の形容詞

big / black / blue / bluest / bottomless / furry / green / hard / huge / large / little / normal / old / purple / red / rural / small / tiny / white / yellow

悪い形容詞

bad / cowardly / cursed / damned / dirty / disgusting / distasteful / dusty / evil / fat / fat-kidneyed / fatherless / foul / hairy / half-witted / horrible / horrid / infected / lying / miserable / misused / oozing / rotten / smelly / snotty / sorry / stinking / stuffed / stupid / vile / villainous / worried

登場人物の名前

Achilles / Adonis / Adriana / Aegeon / Aemilia / Agamemnon / Agrippa / Ajax / Alonso / Andromache / Angelo / Antiochus / Antonio / Arthur / Autolycus / Balthazar / Banquo / Beatrice / Benedick / Benvolio / Bianca / Brabantio / Brutus / Capulet / Cassandra / Cassius / Christopher Sly / Cicero / Claudio / Claudius / Cleopatra / Cordelia / Cornelius / Cressida / Cymberline / Demetrius / Desdemona / Dionyza / Doctor Caius / Dogberry / Don John / Don Pedro / Donalbain / Dorcas / Duncan / Egeus / Emilia / Escalus / Falstaff / Fenton / Ferdinand / Ford / Fortinbras / Francisca / Friar John / Friar Laurence / Gertrude / Goneril / Hamlet / Hecate / Hector / Helen / Helena / Hermia / Hermonie / Hippolyta / Horatio / Imogen / Isabella / John of Gaunt / John of Lancaster / Julia / Juliet / Julius Caesar / King Henry / King John / King Lear / King Richard / Lady Capulet / Lady Macbeth / Lady Macduff / Lady Montague / Lennox / Leonato / Luciana / Lucio / Lychorida / Lysander / Macbeth / Macduff / Malcolm / Mariana / Mark Antony / Mercutio / Miranda / Mistress Ford / Mistress Overdone / Mistress Page / Montague / Mopsa / Oberon / Octavia / Octavius Caesar / Olivia / Ophelia / Orlando / Orsino / Othello / Page / Pantino / Paris / Pericles / Pinch / Polonius / Pompeius / Portia / Priam / Prince Henry / Prospero / Proteus / Publius / Puck / Queen Elinor / Regan / Robin / Romeo / Rosalind / Sebastian / Shallow / Shylock / Slender / Solinus / Stephano / Thaisa / The Abbot of Westminster / The Apothecary / The Archbishop of Canterbury / The Duke of Milan / The Duke of Venice / The Ghost / Theseus / Thurio / Timon / Titania / Titus / Troilus / Tybalt / Ulysses / Valentine / Venus / Vincentio / Viola

良い名詞・中立の名詞には良い形容詞か中立の形容詞を、悪い名詞には悪い形容詞か中立の形容詞を付けられます。

出典

Karl Hasselström・Jon Åslund, “The Shakespeare Programming Language”(仕様書・2001年8月21日版)。サンプルの Hello World・素数・逆順は、この仕様書の付録にあるプログラムです。そのほかの説明は、Esolang Wiki の Shakespeare の項目(esolangs.org)も参照しました。入力はすべてこの端末の中だけで処理され、外へは送信されません。

このツールについて

Shakespeare(SPL)は、登場人物が変数になり、台詞のやり取りが計算になる、戯曲の台本の形をしたプログラミング言語です。実行は舞台の上の人物・値・スタックを見ながらステップ再生でき、入力はこの端末の中だけで処理されます(送信ゼロ)。

台本の形をした言語。実行・舞台のステップ再生(人物・値・スタック・台詞の意味)・仕様書付録の3本を含む7種のプリセット。送信ゼロ。

主な機能

  • 最後まで実行と、1文ずつのステップ再生(再生/一時停止/1文/速度)
  • 舞台にいる人物・各人物の値とスタック・直前の問いの答えを表示
  • 今の台詞の意味を日本語で一言(例: Juliet の値を (Juliet + 2) にする)
  • Hello World・素数・逆順(仕様書付録)と数・文字・足し算・入力そのまま出力のプリセット
  • 対応する文と使える語彙の一覧・文法エラーは行番号つき・100万文で必ず停止・送信ゼロ

よくある質問

Q. Shakespeare(SPL)とはどんな言語ですか?

A. 2001年に Karl Hasselström と Jon Åslund が作った、戯曲の台本の形をしたプログラミング言語です。登場人物が整数を持つ変数になり、人物どうしの台詞が代入・比較・飛び先の指定・入出力になります。

Q. 数はどう書くのですか?

A. 名詞が 1 か -1(flower は 1、pig は -1)で、形容詞が1つ付くごとに2倍になります。「a big big pony」は 4 です。あとは「the sum of A and B」「the product of A and B」などで組み合わせます。

Q. 「You are ...」は値を足す文ですか?

A. いいえ、相手の値をその値にする代入です。増やしたいときは「Thou art the sum of thyself and a big pony.」のように、自分自身の値(thyself)を式に入れます。

Q. 入力欄にはどう書きますか?

A. Open your mind は文字を1つ、Listen to your heart は数を1つ、入力欄の先頭から順に読みます。入力が尽きると -1 が読み込まれるので、逆順サンプルのように -1 を終わりの印にできます。

Q. 仕様のすべてに対応していますか?

A. 文の種類(代入・比較・条件・飛び先・入出力・スタック)は仕様書のものを動かせますが、名詞・形容詞・人物名は仕様の語彙リストの代表的なものに絞っています。リストにない語は文法エラーになります。対応する文と語彙は、ページの解説にあります。

入力値はURLの「#」以降に入るためサーバーには送信されません。リンクを開くと同じ状態を復元します。

続けて整える

運営サイト

私たちが運営するサイト