Home About Contact
Scheme

Scheme で 関数を定義するときに使う lambda の省略

前回のエントリー GIMP Script-Fu を使って 所定のディレクトリ内にある xcf ファイルを png にバッチ変換するで、 関数を定義する部分。 lambda を使う書き方と、使わない書き方があり、なんなんだろうと思って調べた。 どうやら lambda を使わない記述方法は単なる省略表記であるらしい。

Gauche インストール

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

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) のようにして、 f10 を適用してみる。

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!

定番の 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!

以上です。