小编Raj*_*hat的帖子

"The Seasoned Schemer"中的长度函数

我一直在阅读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)

因此, …

scheme seasoned-schemer

5
推荐指数
1
解决办法
367
查看次数

在DrRacket中循环宏

我正在尝试在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作为参数应用于某个过程.

macros scheme racket

3
推荐指数
1
解决办法
4499
查看次数

标签 统计

scheme ×2

macros ×1

racket ×1

seasoned-schemer ×1