Gauche勉強メモ(2日目)

5.1 スクリプト

Gaucheのスクリプトエンジンgoshは引数にファイル名を渡すと、それをSchemeプログラムとして読み込み、中に書かれている式を順に評価する。そして、ファイルの読み込みが終了したあと、その中にmainという手続きの定義があればそれを呼び出す。

mainの引数argsにはスクリプトファイル名とそれ以降のコマンドライン引数のリストが渡される。

main手続きの戻り値がコマンドの終了ステータスとなるので、main手続きの最後で0を返しておくと良い。

なんで0返すんだろう?プログラムの常識?


前の章のFizzBuzzをちょっといじってみた。

(use srfi-1)

(define (check-num x)
  (cond [(= (modulo x 15) 0) 'FizzBuzz]
		[(= (modulo x 3) 0) 'Fizz]
		[(= (modulo x 5) 0) 'Buzz]
		[else x]))

(define (fizz-buzz check max)
  (map check (iota max 1)))

(define (main args)
  (print
   (fizz-buzz check-num (x->number (car (cdr args)))))
0)

実は引数とりだすのに2,3度引っかかった。argsがリストだってことやスクリプト名も含むってことやschemeが型を自動で変換しないってあたりで。

実行結果

$ gosh test.scm 20  
(1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz)

5.5 名前と予約語

Scheme予約語はない。

これ最初すごいなって思った。あと関係ないけど、変数も手続きもどちらもdefineで定義するのもちょっと感動した。


今日はここまで。