Scheme 如何修复此错误:begin(可能是隐式的):在一系列内部定义之后没有表达式

Scheme 如何修复此错误:begin(可能是隐式的):在一系列内部定义之后没有表达式,scheme,racket,Scheme,Racket,我在函数中实现名为fib的生成器时遇到问题。 我希望函数返回一个生成器,生成第一个nFibonacci数 ;THIS IS MY GENERATOR (define fib (let ((a 0) (b 1)) (lambda () (let ((return a)) (set! a b) (set! b (+ b return) )return)))) ;THIS IS MY FUNCTION (define

我在函数中实现名为
fib
的生成器时遇到问题。 我希望函数返回一个生成器,生成第一个
n
Fibonacci数

 ;THIS IS MY GENERATOR

 (define fib
  (let ((a 0) (b 1))
    (lambda ()
      (let ((return a))
        (set! a b)
        (set! b (+ b return)
        )return))))

 ;THIS IS MY FUNCTION
  (define (take n g)  
  (define fib
    (let ((a 0) (b 1) (cont 1))
      (lambda ()
        (if (>= cont n) #f
            (let ((return a))
              (set! cont (+ cont 1))
              (set! a b)
              (set! b (+ b return)
                    )(return)))))))
我希望生成器返回的斐波那契数最多为
N
(传递到函数)。但实际产出是:

begin(可能是隐式的):在中的一系列内部定义之后没有表达式:


正如错误所说,函数定义中除了一些内部定义(显然,它被放入隐式的
begin
)之外,没有表达式。定义了它之后,函数要做什么

更重要的是,解决方案的总体设计存在问题

在编写函数定义时,请立即写下它的示例调用,这样您就可以看到应该/打算/将如何调用它。特别是,

  (define (take n g)
建议您将其命名为
(取10个fib)
,以便在
中取
的定义
g
将获得
fib
的值

但是
fib
是一个全局生成器。在对它的不同调用之间,它不能以任何方式重新启动。这就是为什么您开始复制它的源代码,但后来可能意识到,为什么要使用
g
参数呢?有些地方不太合适

相反,您需要一种方法,在需要时创建一个新的Fibonacci生成器:

(define (mk-fib)
  (let ((a 0) (b 1))
    (lambda ()
      (let ((ret a))
        (set! a b)
        (set! b (+ ret b))
        ret))))    ;; ..... as before .....
现在,每个
(mk fib)
调用都将创建并返回一个新的Fibonacci数字生成器,因此它现在可以用作
take
调用的参数:

(define (taking n g)      ;; (define q (taking 4 (mk-fib)))
现在不需要像您以前尝试的那样定义同一个全局
fib
生成器的新的本地副本。我们只需要针对
take
本身的特定内容:

   (let ((i 1))
     (lambda ()         ; a generator interface is a function call
       (if (> i n)      ; not so good: what if #f
           #f           ;  is a legitimately produced value?
           (begin
             (set! i (+ i 1))
             (g))))))   ; a generator interface is a function call
现在我们可以定义

> (define q (taking 4 (mk-fib)))
> (q)
0
> (q)
1
> (q)
1
> (q)
2
> (q)
#f
> (q)
#f
> 
> (define q (taking 4 (mk-fib)))
> (q)
0
> (q)
1
> (q)
1
> (q)
2
> (q)
#f
> (q)
#f
>