前回のエントリー GIMP Script-Fu を使って 所定のディレクトリ内にある xcf ファイルを png にバッチ変換するで、 関数を定義する部分。 lambda を使う書き方と、使わない書き方があり、なんなんだろうと思って調べた。 どうやら lambda を使わない記述方法は単なる省略表記であるらしい。
Scheme のコードの振る舞いを見るために、わざわざ GIMP を使いたくはないので、Scheme の処理系を入れる。
Chromebook Linux に Scheme の処理系を入れる。 gauche が定番らしい。
$ sudo apt-get install gauche
gosh がコマンド、gosh main.scm とすれば実行できるらしい。
バージョン確認。
$ gosh -V
Gauche scheme shell, version 0.9.10 [utf-8,pthreads], aarch64-unknown-linux-gnu
(version "0.9.10")
define について調べます。
main1.scm
(define v 1)
(print v)
v という変数に 1 を define した。実行。
$ gosh main1.scm
1
1 が標準出力された。
次は f という変数に (lambda (v) (+ v 1)) を define した。実行。
main2.scm
(define f (lambda (v) (+ v 1)))
(print f)
実行する。
$ gosh main2.scm
#<closure (f v)>
f には 関数(closure) が入っている。内容は引数の値に +1 する関数。
では、 (f 10) のようにして、 f に 10 を適用してみる。
main3.scm
(define f (lambda (v) (+ v 1)))
(print (f 10))
実行する。
$ gosh main3.scm
11
引数として与えた 10 が +1 されて 11 が返ってきた。
では、lambda を使わない省略形式で関数を定義してみる。 先程適宜した +1 する関数 f と実質同じ、f2 という名前の関数を定義する。
;(define f (lambda (v) (+ v 1)))
(define (f2 v) (+ v 1))
これを使ってみる。
main4.scm
(define (f2 v) (+ v 1))
(print (f2 100))
実行する。
$ gosh main4.scm
101
定番の Hello, World! 関数 greet で、同じことをしてみる。
hello.scm
(define greet
(lambda (name)
(string-append "Hello, " name "!")))
(define (greet2 name)
(string-append "Hello, " name "!"))
(print (greet "World"))
(print (greet2 "World"))
実行する。
$ gosh hello.scm
Hello, World!
Hello, World!
以上です。