前回インストールして、いくつかGaucheプログラミングをして遊んでいたので、ここらでほんの触りの部分を書いておきましょう。
まずは、ともあれ「Hello World」から。スクリプトとして記述していきます。Schemeでは拡張子を「.scm」とするようで、この拡張子のファイルを読み込むとEmacsもscheme-modeで起動してくれます。
hello-world.scm
#!/usr/local/bin/gosh ;; -*- coding: utf-8 -*- (print "Hello World") (print "こんにちは、世界")
Shebangに「/usr/local/bin/gosh」と記載していますが、Gaucheはファイルの先頭に「!#」で始まる行があった場合、無視するらしいです。
ですので、実行権さえ付けてあげれば
$ ./hello-world.scm
という形で実行することができます。もちろん、goshコマンドで起動してもかまいません。
また、Gaucheはマルチバイト文字をサポートしていますが、Gaucheの内部エンコーディングに頼ったプログラムを書いているのは危険ですので、スクリプト自身にエンコーディングを指定するのがお作法っぽいです。
;; -*- coding: utf-8 -*-
なお「-*-」で囲んでおくとEmacsもエンコーディングを認識するようで、一石二鳥。Gauche自体は「-*-」は不要らしいです。
Pythonでも、近いこと書いてたような…。
これを実行するとこうなります。
$ gosh hello-world.scm Hello World こんにちは、世界
最初のGaucheプログラムですね。
Gaucheはmainという定義が行われていれば、スクリプトファイルの読み込みが完了したら、エントリポイントとしてmainを呼び出すらしいです。
今度は、明示的にmainを定義した場合。
hello-world-args.scm
#!/usr/local/bin/gosh ;; -*- coding: utf-8 -*- (define (main args) (print "Hello World args:" args))
argsは引数になっているので、これで起動時に受け取った引数を使用することができます。
試してみましょう。
$ gosh hello-world-args.scm foo bar Hello World args:(hello-world-args.scm foo bar)
argsの後に引数が出力されていますが、スクリプトファイル自身の名前も入っています。引数の最初の値は、スクリプトファイル名自身のようですね。う〜ん、Cっぽい。
では、今度はちょっと書き換えて、引数が与えられなければ「Hello World」、与えられればそれを「Hello 」の後ろに続けて表示するプログラムを変更してみます。
hello-world-args.scm
#!/usr/local/bin/gosh ;; -*- coding: utf-8 -*- (define (main args) (let-optionals* (cdr args) ((word "World")) (print "Hello" " " word)))
「define」で定義を行うそうな。定義されるのは必ずしも関数だけではなく、変数もこれで定義します。関数「cdr」はHaskell/Scalaでいう「tail」に相当します(「head」は「car」)。
実行。
$ gosh hello-world-args.scm Hello World $ gosh hello-world-args.scm Gauche Hello Gauche
OKですね。