【发布时间】:2021-06-02 18:50:42
【问题描述】:
我目前正在尝试使用宏创建流,如下所示:
(define-syntax create-stream
(syntax-rules (using starting at with increment )
[(create-stream name using f starting at i0 with increment delta)
(letrec
([name (lambda (f current delta)
(cons current (lambda () (name (f (+ current delta) delta)))))])
(lambda () (name f i0 delta)))
]))
但后来当我尝试将以下 lambda 函数传递给它时,会发生编译错误,该函数显示“lambda: not an identifier, identifier with default, or keyword”。
(create-stream squares using (lambda (x) (* x x)) starting at 5 with increment 2)
我怀疑正在发生的事情是,通过尝试在宏中使用 lambda,它会影响 Racket 中的实际 lambda 函数。如果这是真的,我想知道如何在不使用 lambda 的情况下创建流,因为据我所知,需要有一个函数来创建所述流。
这也是一个家庭作业问题,所以我必须使用宏。我创建流的等效函数是:
(define create-stream
(letrec ([name (lambda (f current delta) (cons current (lambda () (name (f (+ current delta) delta)))))])
(lambda () (name f i0 delta))))
【问题讨论】:
-
不要剥离
define name部分,而是尝试保持(define name (lambda () (fn i0))原样,在其后添加name,看看会发生什么。但你真的应该发布一个关于这一切的新问题。
标签: stream macros racket thunk