CLOVER🍀

That was when it all began.

GaucheでHello World

前回インストールして、いくつか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ですね。