lambda式の引数は3種類

外部ライブラリを眺めていると

(lambda l 本体)

みたいに、引数を () で囲っていないのがあって、「あー。引数が1つのときは()を省略できるのだな。(lambda (l) 本体) と同じだ。」と思っていたんだけど。
その後いろいろ動かなくて、よーくコードを眺めていると、どうも l が list 扱いになっているっぽい。


慌てて R5RS を読んでみると

<変数>: 手続きは任意個数の引数をとる。手続きが呼
び出される時には,実引数の列が,一つの新しく割り
付けられたリストへと変換され,そしてそのリストが
<変数> の束縛に格納される。

うは。いまの今まで気づいていなかったよ。
論理的に考えれば、この文法が必要な事は分かるんだけども。
あぶないあぶない。
ということで実装しました。

(lambda (x) hoge)
(lambda x hoge)
(lambda (x . y) hoge)

のように lambda 式の引数は3種類あって、うまく使い分けているということか。

今日の実装

ひたすら、外部ライブラリの取り込みとテスト書きに追われた。
テストもいつのまにか 700 個を越えている。

OK: 1 tests, 729 assertions, 729 successes, 0 failures, 0 errors
追加された手続き
char-ci=? char-ci char-ci>? char-ci<=? char-ci>=? char-alphabetic?
char-numeric? char-whitespace? char-upper-case? char-lower-case? char-upcase char-downcase
string string>? string<=? string>=? string-ci string-ci>?
string-ci<=? string-ci>=? substring string-append string->list list->string
string->copy string-fill! vector->list list->vector vector-fill! map
for-each make-promise force delay eqaul? lcm
gcd rationalize member assoc string
force / delay が正しく動いているか

force / delay が正しく動いているかを試してみる。

mona> (define x (delay (display 3)))
x
mona> (force x)
3#<undef>
mona> (force x)
#<undef>

(force x) の結果が1回目と2回目を比べると、正常動作しているっぽい。
感無量。