私はTheSeasonedSchemerを読んでいて、長さ関数のこの定義に出くわしました
(define length
(let ((h (lambda (l) 0)))
(set! h (L (lambda (arg) (h arg))))
h))
後で彼らは言う:
(L(lambda(arg)(h arg)))の値は何ですか?機能です
(lambda (l)
(cond ((null? l) 0)
(else (add1 ((lambda (arg) (h arg)) (cdr l))))))
私はこれを完全には理解していないと思います。私たちは自分たちをエクササイズとして定義することになっていると思います。私はletrecを使用して長さの定義内にLの定義を書きました。これが私が書いたものです:
(define length
(let ((h (lambda (l) 0)))
(letrec ((L
(lambda (f)
(letrec ((LR
(lambda (l)
(cond ((null? l) 0)
(else
(+ 1 (LR (cdr l))))))))
LR))))
(set! h (L (lambda (arg) (h arg))))
h)))
したがって、Lは引数として関数を取り、値としてリストを引数として取り、リストに対して再帰を実行する別の関数を返します。私の解釈は正しいですか、それとも絶望的に間違っていますか?とにかく定義は機能します
(length (list 1 2 3 4)) => 4