コンパイル
前回はIronSchemeをインストールしました。
今回はプログラムをコンパイルしてみましょう。
前回現れた2つのファイル、そのうちひとつがコンパイラとして使えます。
IronScheme.exe
です。
これはそのまま実行しても使いにくいです。
ですからこれの本体である
"C:/Program Files\IronScheme/IronScheme.Console.exe"
を、ソースコードのあるディレクトリで実行しましょう。
つまりコマンドプロンプトを実行し、カレントディレクトリを、ソースコードのあるディレクトリまで移動し、そこからIronScheme.exeを呼ぶのです。
かんたんですね!
(簡単ではないと思った方へ。
まじめに説明します。すみません。
手順として一番お手軽なのは、次のような内容が書かれたrun.batファイルを、ソースコードのあるディレクトリ(実際の所、作業しやすそうだと思ったらどんなディレクトリでも構いません)に作ることです。
"C:\Program Files\IronScheme\IronScheme.Console.exe"
具体的には、好きなディレクトリを開いた状態で空白を右クリック-> [新規作成] -> [テキスト文書]。
名前はrun.batにしてください。
最後の拡張子.txtは消します(警告が来ますが、無視です)。
そしてアイコンを右クリックして[編集]。
メモ帳が開きますから、その中に"C:\Program Files\IronScheme\IronScheme.Console.exe"を貼り付けて(""も含め)、[ファイル]→[保存]します。
あとはこうしてできたrun.batのアイコンをダブルクリックすればインタープリターが起動します。
)
IronScheme.exeを実行すると、IronSchemeのインタープリターがスタートします。
これでコンパイルの準備は完了です。
(かわっていますが、インタープリターからコンパイルするようです。ややこしいですね)
あらたに"helloworld.scm"という名前のファイルを作ります。
これがIronSchemeのソースコードファイルです。
"helloworld.scm"
(import (ironscheme clr))
(clr-static-call System.Console WriteLine "Hello World!")
これを保存します。
そしてさきほどのインタープリターに次のように書くのです。
>(compile "helloworld.scm" #t)
エンターを押すと、無事ソースコードのあるディレクトリの中にhelloworld.exeが作られます。
と、もうひとつ、helloworld.exe.configも作られます。
helloworld.exeを実行してもすぐ終わってしまう?
ならhelloworld.scmを次のように書き換えましょう。
(import (ironscheme clr))
(clr-static-call System.Console WriteLine "Hello World!")
(clr-static-call System.Console ReadLine)
これでReadLineがプログラムを止めます。
実行結果をちゃんと見ることが出来ます。
C#で言うとこうなります:
class Program
{
static void Main(string[] args)
{
System.Console.WriteLine("Hello World!");
System.Console.ReadLine();
}
}
コードの意味
LispやSchemeは基本的に大量のカッコからなっています。
カッコでその中身を実行するのです。
カッコの中身は関数だったり特殊形式と呼ばれるものだったりします。
ともかく、何かを行うものがカッコの中にあるのです。
(関数名 引数1 引数2...)
ですから今回は、次のような関数?を使ったことになります:
import
clr-static-call
importは既存のライブラリを使うためのものです。
(ironschemeはIronSchemeのライブラリを表す何かでしょう。
インストールしたディレクトリを見ると、IronSchemeディレクトリの中にCLRファイルがあります。
上手く対応しているのですね。)
clr-static-callはCLRのstaticなメソッドを呼ぶマクロです。
おもしろいのはWriteLineが関数なのではなくclr-static-callが関数(というかマクロ)なのだということですね。
(WriteLine System.Console "Hello World!")ではありません。
(System.Console WriteLine "Hello World")でもありません。
面白いというか・・・めんどくさそうです。
Schemeっぽい書き方
上では.netのライブラリを使いましたが、もう少しオリジナルのSchemeっぽい書き方をすることも出来ます。
(import (rnrs))
(display "Hello World!")
(newline)
あるいはConsole.ReadLine()に相当するものを付け加えると:・
(import (rnrs))
(display "Hello World!")
(newline)
(get-line (current-input-port))
rnrsは"Revised N Report on the Algorithmic Language Scheme"の略です。
現在nは6で、R6RSです。
便利なライブラリが詰まっているようです。
displayは
(display obj)
で、objを表示します。
Console.Write(obj)に相当するようです。
newlineは新しい行を書きます。
Console.WriteLine()(引数なし)と同じですね。
get-lineは
(get-line textual-input-port)で、textual-input-portという入力ポートから、行を読み込みます。
textual-input-portを(current-input-port)にすれば標準出力から文字の行を読み込むのです。
(current-iput-port)はデフォルトの入力ポートを返します。
普通は標準出力です。
しかし後から動的にに変わることもあります。