R6RS:翻訳:R6RS:11.4.2 Procedures
11.4.2 手続き
(lambda <formals> <body>)
構文: <formals> は下で述べる形式仮引き数リストでなければならず、 <body> は R6RS:翻訳:R6RS:11.3 Bodies で述べたものでなければならない。
意味論: lambda 式は手続きに評価される。 lambda 式の評価された時に有効な環境は手続きの一部として記憶される。後になって手続きが引き数とともに呼び出されると、 lambda 式が評価されたところの環境が仮引き数リスト中の変数を新たな場所に束縛することで拡張され、引き数値の評価結果がその場所に格納される。それから、 lambda 式の本体部分(定義を含むこともあるため、 letrec* フォームを表現することもある。 R6RS:翻訳:R6RS:11.3 Bodies 参照)の式が拡張された環境で順番に評価される。本体部分の最後の式の評価結果が手続き呼び出しの結果として返される。
(lambda (x) (+ x x)) ⇒ a procedure ((lambda (x) (+ x x)) 4) ⇒ 8 ((lambda (x) (define (p y) (+ y 1)) (+ (p x) x)) 5) ⇒ 11 (define reverse-subtract (lambda (x y) (- y x))) (reverse-subtract 7 10) ⇒ 3 (define add4 (let ((x 4)) (lambda (y) (+ x y)))) (add4 6) ⇒ 10
<formals> は次のような形式をしていなければならない。
- (<variable1> ...): 手続きは固定個数の引き数を取る。手続きが呼び出されると、引き数は対応する変数の束縛に格納される。
- <variable>: 手続きは任意個数の引き数を取る。手続きが呼び出されると、引き数の並びは新たに割り当てられたリストに変換され、そのリストが <variable> の束縛に格納される。
- (<variable1> ... <variable_n> . <variable_n+1>): 最後の変数の前にピリオド . があった場合、手続きは n 個以上の引き数を取る。 n はピリオドの前の仮引き数の個数である(少なくともひとつはなければならない)。最後の変数の束縛に格納されている値は、他の引き数をすべて他の仮引き数に照合したうえで残った引き数を新たに割り当てたリストにしたものである。
((lambda x x) 3 4 5 6) ⇒ (3 4 5 6) ((lambda (x y . z) z) 3 4 5 6) ⇒ (5 6)
どの <variable> も <formals> 中に 2 度以上現れてはならない。