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回目を比べると、正常動作しているっぽい。
感無量。