(define twice-the-stream
(lambda (n)
(letrec ([produce (lambda (current next)
(cons (* 2 current)
(lambda()
(produce (current next) (force (next))))))])
;; this is wrong: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
(produce (car n) (force (cdr n))))))
Sie haben bereits die (cdr n)
an diesem Punkt erzwungen; jetzt next
ist keine Funktion, es ist ein Strom - ein Nachteil Paar seine aktuelle Nummer und seine Stream-Tail.
current
ist auch keine Funktion. Es ist eine Nummer, die bereits verwendet wird, um die doppelte Nummer über diesem Anruf zu erzeugen.
die kognitive Belastung zu verringern, benennen Sie die Variablen, die Sie daran zu erinnern, was sie sind,
(define twice-the-stream
(lambda (numbers-stream)
(letrec ([produce (lambda (current-num next-str)
(cons (* 2 current-num)
(lambda()
(produce (current-element next-str)
(force (next-elements next-str))))))])
(produce (car numbers-stream) (force (cdr numbers-stream))))))
und jetzt können Sie sehen, dass Sie durch übermäßig suggestive (und unter ausgeprägten Schwerpunkt) Namensgebung verwechselt wurde, in Ihrer Meinung "aktuelle" Nummer mit "aktuelle Nummer" Funktion und "nächste" Stream mit "Next Stream" -Funktion zusammenfließen. Durch Aufbrechen des Spruchs ist nun klar, was getan werden muss, um die beiden produce
Anrufe synchron zu bringen.
übrigens, wenn Sie kürzeren Variablennamen in erster Linie benutzt haben, ns
für „einen Strom von Zahlen“, n
für „eine Zahl“, s
für „einen Strom“, dann würden Sie haben eine etwas weniger Chance zu verwirren,
(define twice-the-stream
(lambda (ns) ;; a numbers stream
(letrec ([produce (lambda (n s) ; a number, and a stream
(cons (* 2 n) ; a number, doubled
(lambda() ; a stream, repackaged:
(produce (.... s) ; _its_ 1st element
(force (.... s))))))]) ; and the rest
(produce (car ns) (force (cdr ns))))))
so zu tun, was man eigentlich tun (angeblich) zu - dh mit beschreibenden Namen (aber nicht aussagekräftig genug) - ist, was Sie haben in dieses Problem an erster Stelle!
angeblich nicht eine gute Sache - aber solange sie in den Kommentaren klar beschrieben werden, sehe ich nicht, warum das so sein sollte.