Schemeに入力しよう

規範的な最初のプログラムはコンソール上に "Hello, World!"と出すプログラムです。 お気に入りのエディタを使ってhello.scmという 名前のファイルを以下の内容でつくりましょう。

;最初のプログラム

(begin
  (display "Hello, World!")
  (newline))

最初の一行はコメントです。Schemeはセミコロンを見るとそれと その行のそれ以降を無視します。

begin-フォームサブフォームのならびを導入する Schemeのやりかたです。この場合には、ふたつのサブフォームがあります。 最初のものは、その引数(文字列"Hello, World!")をコンソール(あるいは “標準出力”)に出力するdisplay手続きを呼んでいます。 つづいて、改行復帰を出力するnewline手続きを呼んでいます。

このプログラムを走らせるには、まず、Schemeをスタートさせます。 OSのコマンドラインでSchemeの実行ファイル名を入力するという よくある方法です。たとえば、MzScheme [cite{mzscheme}]の場合は、

mzscheme 

とOSのプロンプトから入力します。

これで、Schemeのリスナーが起動します。Schemeのリスナーは 入力を読み(read)、それを評価(evaluate)し、結果の値 (もし、あれば)を印字(print)し、次の入力を待ちます。そのため、 このことをよく、read-eval-print ループといいます。 これはOSのコマンドラインとあまり違いがないことに注目してください。 OSのコマンドラインは、コマンドを読み、それを実行し、そして次を 待ちます。OSと同じように、Schemeのリスナーは独自のプロンプトを 表示します。よくあるのは、> ですが、別のもののときもあります。

リスナーのプロンプトが出ているところで、ファイルhello.scmロードしてみよう。これは次のようにタイプすればできます。

(load "hello.scm")

今度はShemeはhello.scmの内容を実行し、Hello, World!を 出力したのち改行するでしょう。その後、リスナーはまたプロンプトを 表示して、さらなる入力を待ちます。

こんな風に熱心なリスナーですから、必ずしも、ファイルにプログラムを書いて、 それをロードするということをする必要はありません。 ときには、ちょっと試してみたいという気分のときには 単純に式を直接リスナーのプロンプトから入力して何ば起こるかみること も簡単にできます。たとえば、次のフォーム

(begin (display "Hello, World!")
       (newline))

Schemeのプロンプトから入力すると、以下のようになります。

Hello, World! 

実は、単に"Hello, World!"というフォームをリスナーに入力するだけで 以下のような文字列を結果として得ることができるのです。

"Hello, World!"

なぜなら、これがリスナーが"Hello, World!"を評価した結果 だからです。

ふたつめのやり方では、結果が二重引用符に囲まれているということとは 別に、最後の二つのプログラムには大きな違いがあります。 最初のもの(つまりbeginを使っているもの)は評価して何かを得ている わけではありません。Hello, World!という表示はdisplaynewline標準出力に書き込む手続きによってつくられた副作用です。 ふたつめのプログラムでは、フォーム"Hello, World"が評価の結果で、 この場合は同じフォームの文字列になっています。

これ以降、評価を表すのには、=> という記法をつかうことにします。 それゆえ、

E =>  v

はフォームEが評価されて結果として値vになることを示します。 たとえば、

(begin
  (display "Hello, World!")
  (newline))
=> 

(すなわち、無あるいは空)。しかし、副作用により

Hello, World! 

と標準出力に書き込まれます。 一方、

"Hello, World!"
=>  "Hello, World!"

です。どちらの場合にも、リスナーから抜けることはありません。 抜けるには、

(exit)

と入力するとOSのコマンドライン(これは先にみたように一種のリスナー) にもどります。

リスナーはプログラムやプログラムの断片を対話的にテスト するのに便利です。しかし、それでなければならない、 というわけではありません。

mzscheme -r hello.scm 

とするとリスナーを扱わなくても、挨拶がつくられます。 挨拶のあと、mzschemeはOSにもどります。 これは、

echo Hello, World! 

とやるのとほぼ同じです。hello.scmをOSのコマンド (シェルスクリプトあるいはバッチファイル)とみなすこともできますが、 それは 16章まで待ってください。