В настоящее время я пытаюсь создать поток с помощью макроса, как показано ниже:
(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)))
]))
Что происходит, так это то, что я получаю ошибку компиляции позже, когда пытаюсь передать ей следующую лямбда-функцию, которая говорит лямбда: не идентификатор, идентификатор по умолчанию или ключевое слово.
(create-stream squares using (lambda (x) (* x x)) starting at 5 with increment 2)
Я подозреваю, что при попытке использовать лямбда в макросе он затеняет фактическую лямбда-функцию в Racket. Если это правда, мне интересно, как можно создать поток без использования лямбда, поскольку, насколько я могу судить, где-то должна быть функция для создания указанного потока.
Кроме того, это домашнее задание, поэтому мне нужно использовать макрос. Моя эквивалентная функция для создания потока:
(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
, и посмотрите, что произойдет. но вы действительно должны опубликовать новый вопрос со всем этим. - person Will Ness   schedule 05.03.2021