我一直在阅读The Seasoned Schemer,我遇到了长度函数的这个定义
(define length
(let ((h (lambda (l) 0)))
(set! h (L (lambda (arg) (h arg))))
h))
Run Code Online (Sandbox Code Playgroud)
后来他们说:
(L(lambda(arg)(h arg)))的值是多少?这是功能
(lambda (l)
(cond ((null? l) 0)
(else (add1 ((lambda (arg) (h arg)) (cdr l))))))
Run Code Online (Sandbox Code Playgroud)
我不认为我完全理解这一点.我想我们应该将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)))
Run Code Online (Sandbox Code Playgroud)
因此, …
我正在尝试在DrRacket中为while循环创建一个宏.这是我写的:
(require mzlib/defmacro)
(define-macro my-while
(lambda (condition body)
(list 'local (list (list 'define (list 'while-loop)
(list 'if condition
(list body (list 'while-loop))
'(void))))
'(while-loop))))
(define x 0)
(my-while (< x 10)
(begin
(display x)
(newline)
(set! x (+ x 1))))
Run Code Online (Sandbox Code Playgroud)
该程序的输出是:
0
1
2
3
4
5
6
7
8
9
error: procedure application: expected procedure, given: #<void>; arguments were: #<void>
Run Code Online (Sandbox Code Playgroud)
有人可以帮我弄这个吗?为什么这个宏不会终止并返回void.似乎当条件不为真时,系统会尝试将void作为参数应用于某个过程.