[Prev] [ Up ] [Next]
lambda(ラムダ)式は,(名前のない)関数を記述するものである. たとえば,ある数に1を加える関数は,lambda式を使って,
(lambda (x) (+ x 1))と定義できる.lambda式を演算子として引数を与えれば
> ((lambda (x) (+ x 1)) 0) 1のように,関数の値を計算できる. これは,通常の関数の呼出しと全く同様である.
> (define (succ x) (+ x 1))などとするが,実はこれは
> (define succ (lambda (x) (+ x 1)))のように,lambda式によって記述される関数にdefineで名前を定義することの便 宜上の省略形式なのである.
lambda式の構造は以下の通り.
(lambda 形式引数 式1 式2 .... 式n)なお形式引数は,以下のいずれか
;; (define (prec x) (- x 1))でも同じ > (define prec (lambda (x) (- x 1))) prec > (prec 2) 1 > (prec 1 2) ⇒ ERROR: Wrong number of arguments > (prec) ⇒ ERROR: Wrong number of arguments
;; (define (f x y . z) (list x y z))でも同じ > (define f (lambda (x y . z) (list x y z))) f > (f 1 2 3 4 5) (1 2 (3 4 5)) > (f 1 2 3) (1 2 (3)) > (f 1 2) (1 2 ()) > (f 1) ⇒ ERROR: Wrong number of arguments
;; (define (mylist . x) x)でも同じ > (define mylist (lambda x x)) mylist > (mylist 'a 'b '(1 2 3)) (a b (1 2 3)) > (mylist) ()
lambda式を使うと,いちいち関数に名前を定義しなくても,関数を別の関数の引 数に使うことができる.
;; 1変数関数f(x)について,f(a)+ ... + f(b)を計算する > (define (sum f a b) (if (> a b) 0 (+ (f a) (sum f (+ a 1) b)))) sum > (sum (lambda (x) (* x x)) 1 5) 55 ;; = 1^2 + 2^2 + 3^2 + 4^2 + 5^2 > (* 8.0 (sum (lambda (x) (/ 1 (* (- (* 4 x) 3) (- (* 4 x) 1)))) 1 100)) 3.13659268483882 ;; ⇒ゆっくりとπに収束する.
また関数を返す関数も定義できる.
> (define (succ-n n) (lambda (x) (+ x n))) succ-n > (succ-n 1) #<function> ;; (lambda (x) (+ x 1))という関数 > (+ ((succ-n 2) 1) ((succ-n 4) 2)) ;; (+ ((lambda (x) (+ x 2)) 1) ((lambda (x) (+ x 4)) 2)) 9
[Prev] [ Up ] [Next]