hello.splをドキュメントを参照しながら解説

まずは実行

hello.splがどういったプログラムなのかを解析してみましょう。examplesディレクトリの中のhello.splを参照してください。

hello.splは、いわゆるHello Worldプログラムです。インストールの時にexeが勝手に作られているので、まずは実行してみてください。

$ cd examples
$ hello

出ますね。Hello World!

ソース解析のための準備

では内容を解析してみましょう。の前にまず自分用のディレクトリを作成して、そこにhello.splをコピーしてそれを見るようにしましょう。そのほうが楽なので。

$ mkdir ../mysample
$ cp hello.spl Makefile ../mysample

コンパイルもしたいので、ついでにMakefileもコピーしときました。(mysampleをカレントディレクトリにしてmake helloとするとhello.splをコンパイルしてhello.exeを作成してくれます。)

Title

ではhello.splを一行目から見ていきましょう。lessでもviでも使って開いてみてください。一行目には以下のように書かれています。

The Infamous Hello World Program.

ここについて説明する項は、Titleになります。以下のように書いてあります。

The first line of every SPL program is the title. Or actually, everything up until the first period is the title, whether it's one line, three lines, or half a line. You're generally free to insert space and newlines wherever you want in the code, but we urge you to please indent tastefully.

The title serves only aesthetic purposes. From the parser's point of view, it's a comment.

適当に訳してみましょうか。

すべてのSPLプログラムの最初の行はタイトルです。一行であろうが三行または行の半分であろうが最初のピリオドまでがタイトルです。コード中には改行とスペースはどこにでも挿入することが出来ます。しかし私達は上品にインデントすることをあなた達に促します。

タイトルは審美的な目的だけに役立ちます。パーサーの視点から見ると、それはコメントになります。

自信はあまり無いですが、おそらく大体あってると思われます。

まぁ、ようは最初の一文はプログラムのタイトルでそれ自身に意味は無いってことですよ。

Dramatis Personæ

次は3〜6行目ですね。

Romeo, a young man with a remarkable patience.
Juliet, a likewise young woman of remarkable grace.
Ophelia, a remarkable woman much in dispute with Hamlet.
Hamlet, the flatterer of Andersen Insulting A/S.

ここの説明は、Dramatis Personæにあります。

The next few lines are a list of all characters in the play. Think of them as variables, capable of holding a signed integer value. You must declare every character you intend to use, or the program won't compile.

A declaration consists of a name, followed by a description of the character (which is ignored by the parser). You can't pick just any name, however; you must use a real Shakespeare character name, such as Romeo, Juliet, or the Ghost (Hamlet's deceased father).

次の少数の行は登場人物全員のリストです。(登場人物って訳は違うかな?)それらをsigned int型の変数とみなしてください。使用する登場人物すべてを宣言しなければなりません、そうしなければプログラムのコンパイルが通りません。

宣言は登場人物名と、それに続く人物の特徴から成ります。(特徴はパーサーによって無視されます。)しかしながら、どんな名前でもよいということはありません、Romeo、JulietあるいはGhost((Hamletの死亡した父親)のような実際のシェークスピア作品に登場する人物名を使用しなければなりません。

そろそろ香ばしい匂いがしてきましたね。変数名はシェークスピアの作品中に出てくる登場人物名でなければならい変数(人名)宣言の時にはその人物の特徴を書かなければならない。(しかもプログラムとは無関係)

ってことで3〜6行目は、RomeoJulietOpheliaHamletという変数を宣言していて、その人物達の特徴が書かれているということです。

Acts and Scenes

次は9〜11行目、32行目、42行目、57〜59行目、76行目です。

9〜11行目
                    Act I: Hamlet's insults and flattery.

                    Scene I: The insulting of Romeo.
32行目
                    Scene II: The praising of Juliet.
42行目
                    Scene III: The praising of Ophelia.
57〜59行目
                    Act II: Behind Hamlet's back.

                    Scene I: Romeo and Juliet's conversation.
76行目
                    Scene II: Juliet and Ophelia's conversation.

この部分の説明は、Acts and Scenesにあります。

The purpose of acts and scenes is to divide the play into smaller parts. A play consists of one or more acts, each act consists of one or more scenes, and each scene consists of lines (where the characters say something) and enter and exit statements, which cause characters to get on and off the stage.

Acts and scenes are numbered with roman numerals. They begin with the word ``Act'' or ``Scene'', then the number, and then a description of what happens in that act or scene. Just as with the title and the character descriptions, these descriptions are ignored by the parser.

Besides being beautiful and descriptive, acts and scenes also serve as labels, which can be jumped to using goto statements. There are no gotos in the Hello World program, however, so we'll talk about that later.

「行動」と「場面」の目的はプログラムをより小さな部分に分割することです。(playをプログラムと訳すのは無理があったか?)プログラムはひとつ以上の「行動」からなります、各「行動」はひとつ以上の「場面」からなります、各「場面」は行(登場人物が何かを言うところ)とEnter、Exitステートメントからなります、それは登場人物がステージにあがったりステージから降りたりするためにあります。

「行動」と「場面」にはローマ数字番号がつけられます。(I、II、III、IVってやつ)それらは”Act”と”Sean”という単語から始まり、その後に数字、そして次にその「行動」あるいは「場面」で起こることを記述します。ちょうどそれはタイトル、および登場人物の記述の時のようにパーサーに無視されます。

美しく記述的なことに加えて、さらに「行動」と「場面」はラベルとしても役立ちます、それらはgotoステートメントでのジャンプにも使用できます。Hello Worldプログラムの中にはgotoステートメントはありませんが、それについてはその後話すことになるでしょう。

役割としてはgotoで使用するラベルですね。ただし、以下の書き方のみが認められます。

説明部分は例によってパーサーに無視されます。

Enter, Exit and Exeunt

次は大量にあるEnterとかExitという、13、30、34、40、44、54、61、74、78、89行目についてです。

13行目
[Enter Hamlet and Romeo]
30行目
[Exit Romeo]
34行目
[Enter Juliet]
40行目
[Exit Juliet]
44行目
[Enter Ophelia]
54行目
[Exeunt Ophelia and Hamlet]
61行目
[Enter Romeo and Juliet]
74行目
[Exit Romeo]
78行目
[Enter Ophelia]
89行目
[Exeunt]

Enter, Exit and Exeunt

To be able to speak their lines, characters must be on stage. The character they address as ``you'' (or ``thou'' or any other second-person pronoun) must also be on stage. But if there is yet another character on stage, it's not clear which one is intended. This is frowned upon by the parser.

Enter Enter and Exit. These directives cause characters to get on and off stage. ``Enter'' is followed by a list of one or more characters. ``Exit'' is followed by exactly one character. The plural of Exit is ``Exeunt'', which is followed by a list of at least two characters - or none, in which case everyone leaves.

An Enter directive given to a character already on stage, or the other way around, will cause a runtime error.

彼らに会話をさせるためには、登場人物はステージにあがっていなければなりません。それらが"you"(あるいは"thou"あるいは他の二人称代名詞)と呼ぶ人物は、さらにステージ上にいなければなりません。しかしステージ上にすでに他の登場人物がいる場合、だれが意図されるのかが明確ではありません。これはパーサーによって眉をひそめられます。

Enter Enter and Exit.(If you don't get the joke, you can mail the authors and ask.)(ここは何が言いたいのか良くわからなかった、なんかジョークって書いてあるし)これらは登場人物にステージに上がるか降りるかを指示するためにあります。"Enter"は一人以上の登場人物が後に続きます。"Exit"は一人の登場人物のみが後に続きます。複数人を対象にしたExitは"Exeunt"で、後には最小で二人の登場人物を指定します−また、後に何も指定しない場合は全員が退場します。

すでにステージ上にいる人物に登場を指示すると、反対にランタイムエラーが発生します。

我ながらかなり怪しい訳です。

EnterExitExeuntは、人物の登場や退場を指示するもので、Enter XXXExit XXXのような形で使用するということです。ただし同じ人物を重複で登場させた場合はランタイムエラーになりますよ。という感じでしょう。

会話部分の説明

次は、登場人物同士の会話部分について書いていきます。例えば、15行目以下の部分です。

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!

 You are as brave as the sum of your fat little stuffed misused dusty
 old rotten codpiece and a beautiful fair warm peaceful sunny summer's
 day. You are as healthy as the difference between the sum of the
 sweetest reddest rose and my father and yourself! Speak your mind!

 You are as cowardly as the sum of yourself and the difference
 between a big mighty proud kingdom and a horse. Speak your mind.

 Speak your mind!

ここを説明する項目は4つあります。LinesConstantsAssignment of ValuesOutputです。

Lines

まずはLinesについて。

A line consists of the name of a character, a colon, and one or more sentences. In the Hello World program, only two kinds of sentences are used: output, which causes output to the screen, and statements, which cause the second person to assume a certain value.

一文(文というより一つのまとまり)は登場人物名、コロン、一つ以上のsentence(なんて訳すべきかわかんね)(文でいいのかな?)から成ります。Hello Worldプログラムの中では2種類のsentenceが使用されています。:output(スクリーンに出力をもたらします)そしてstatements(それらは第2の人にある値を仮定させます)

一つの文(まとまり)は、登場人物名:XXXXといったようになります。これでプログラムの主な書き方がわかるようになりました。

Constants

次は定数値の扱い方について。

Constants

First, we'll explain how constants (that is, constant numbers, such as 17 and 4711) are expressed.

Any noun is a constant with the value 1 or $-1$, depending on whether it's nice or not. For example, ``flower'' has the value 1 because flowers are nice, but ``pig'' has the value $-1$ because pigs are dirty (which doesn't prevent most people from eating them). Neutral nouns, such as ``tree'', count as 1 as well.

By prefixing a noun with an adjective, you multiply it by two. Another adjective, and it is multiplied by two again, and so on. That way, you can easily construct any power of two or its negation. From there, it's easy to construct arbitrary integers using basic arithmetic, such as ``the sum of $X$ and $Y$'', where $X$ and $Y$ are themselves arbitrary integers.

For example, ``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''. Substituting the simple constants with numbers, we get ``the difference between the square of the difference between 2 and 4 and the cube of -4''. Now, since the difference between 2 and 4 is $2 - 4 = -2$, and the cube of $-4$ is $(-4)^3 =-64$, this is equal to ``the difference between the square of $-2$ and $-64$''. The square of $-2$ is $(-2)^2 = 4$, and the difference of 4 and $-64$ is 60. Thus, ``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'' means 60.

As you see, this way of writing constants gives you much more poetic freedom than in other programming languages.

最初に、私達は定数(すなわち17、4711のような一定の数)がどのように表現されるかを説明します。

どのような名詞も1もしくは-1を備えた定数であり、値はそれが良いものかどうかに依存します。例えば、”花”は1です何故なら花は良いからです、しかし”豚”は-1です何故なら豚は汚いからです。(それはほとんどの人々がそれらを食べるのを防がない(ここの訳が良くわからないことになってしまった))"木"のような中立の名詞は、1と同様に見なされます。

形容詞を名詞の前に付けることによって、それに2が掛けられます。他の形容詞がある時、それに2を再び掛けます。そのように、容易に2あるいはその否定のどんな累乗も構築することができます。そこから、XとYがそれら自身任意の整数である場合"the sum of X and Y"のような基礎的な算術を使用して、任意の整数を構築することは容易です。

例えば``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''の文について。``the difference between the square of the difference between 2 and 4 and the cube of -4''という単純な定数に置き換えることが出来ます。さしあたって”since the difference between 2 and 4”は2-4=-2、”and the cube of -4”は(-4)の3乗=-64、これは``the difference between the square of -2 and -64''と同じ意味になります。”The square of -2”は(-2)の2乗=4、”and the difference of 4 and -64”は60。このように、``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という意味になる。

見てのとおり、この方法で定数を書けば他のプログラミング言語よりはるかにあなたに詩の自由を与えます。

すべての名詞が1か-1を持っていて、それらに形容詞をつけることによって、その名詞に2をかけることができます。形容詞を複数つけることによって2のべき乗をあらわすことができ、それらに対して1または-1をかけるので、いろいろな数字をあらわすことが出来ます。

わかりやすく言うと、花=1で、美しい花=2で、美しくおいしい花=4になるということです。これで定数を表します。

あと、足し算はthe sum of xx and xxといった形で使用できます。引き算はthe difference between xx and xxといった形で使用できます。the square of xxとするとxxの2乗、the cube of xxとするとxxの3乗というように使用できます。

どうでもいいけど、and the difference of 4 and -64 is 60.の部分ってand the difference between 4 and -64 is 60.の間違いじゃないのかな?まぁいいか。

Assignment of Values

次に変数への値の割り当てについてです。これはAssignment of Valuesに書いてあります。

Now, how do we use those numbers? Well, just have a look at the two statements ``You lying stupid fatherless big smelly half-witted coward!'' and ``You are as stupid as the difference between a handsome rich brave hero and thyself!''

The first one is simple: A second person pronoun, followed by a number. The effect of this statement is to assign the value of that number (in this case, $-64$) to the character being spoken to. Think ``$X=-64$''.

The second one is slightly more complicated. For starters, what is the value of ``thyself''? That's not a noun, that's a reflexive pronoun. It's value is the current value of the character being spoken to. So the number in the second statement is $8 - X$, where $X$ is the value of the character being spoken to. And just as you might expect from your experience with English, the second statement is just another assignment. Think ``$X$ = 8 - $X$''. Being ``as bas as'', ``as good as'', or as [any adjective] as something else, means being equal to that something.

私たちはどのようにそれらの数(定数値のこと)を使用しますか?では、この二つの文を見てください。``You lying stupid fatherless big smelly half-witted coward!'' と``You are as stupid as the difference between a handsome rich brave hero and thyself!''

最初のものは単純です:二人称代名詞が値を保持します。この文の意味は話しかけられている登場人物にその数(この場合-64)の値を保持させることです。”X=-64”と考えてください。

二番目のものは少し複雑です。"thyself"の値はまず最初に何ですか?それは名詞ではありません、それは再帰代名詞です。それは値です、話しかけられている人物の現在値です。したがって、二番目の文は8-X、Xが話されている人物の値です。また、あなたが英語との経験から期待するように、二番目の文は別の割り当てです。"X=8-X"と考えてください。"as bas as", "as good as",もしくは "as [任意の形容詞] as"の時は、それが他の何かと等しいことを意味します。

ここでは定数の値を変数に保存するやり方が書いてあります。You lying stupid fatherless big smelly half-witted coward!の場合は、Youlying stupid fatherless big smelly half-witted coward!の値を保存するという意味になり、You are as stupid as the difference between a handsome rich brave hero and thyself!の場合は、Youthe difference between a handsome rich brave hero and thyself!の値を保存という意味になります。

これで変数に値を保存することが出来るようになりました。

Output

次はOutputについてです。保存した変数の値をOutputすることが出来ます。その方法はOutputにあります。

The other kind of sentence used in the Hello World program is output. There are two different output sentences, ``Open your heart'' and ``Speak your mind''. The first causes the character being spoken to to output her or his value in numerical form, and the other, being more literal, outputs the corresponding letter, digit, or other character, according to the character set being used by your computer.

In this program, we use only the second form. The whole program is a long sequence of constructing a number, writing the corresponding character, constructing the next number, writing the corresponding character, and so on.

Hello Worldの中で使われている他の種類のsentenceは出力です。二つの異なる出力sentenceがあります``Open your heart''そして``Speak your mind''です。一つ目の文は話しかけられている人物(彼または彼女)の値を数字で出力、もう一つの文は、あなたのコンピューターで使用されている文字セットによって、対応する文字、数字あるいは他のキャラクターを出力します。

Open your heartSpeak your mindを使用することにより。変数の値を出力することが出来ます。Open your heartの場合は、その時のYouの値を数値として出力します。Speak your mindの場合は、その時のYouの値をそのコンピュータのキャラセットコード値(たとえばAsciiなど)として出力します。

終わりに

これでhello.splで使用している構文の意味が一通り理解できました。(たぶん)

次の項ではhello.spl内では値がどのように動き、最終的にどのように出力しているのかを書いていきます。