首先我会提问。
假设将输入定义为一个返回“istream”的函数 - 一个当被强制产生一对时,其cdr为istream的承诺:
(define input (lambda () (delay (cons (read) (input)))))
现在我们可以定义驱动程序以期望一个“ostream” - 一个空列表或一对,其cdr是一个ostream:
(define driver
(lambda (s)
(if (null? s) '()
(begin
(display (car s))
(driver (force (cdr s)))))))
注意使用武力。
显示如何编写函数square以使其以istream作为参数并返回ostream。然后,您应该能够键入(driver(squares(input)))并查看相应的行为。
书中的正方形在上面。
(define squares (lambda (a)
(cons "please enter a number\n"
(let ((n (car a)))
(if (eof-object? n) '()
(cons (* n n) (cons #\newline (squares (cdr a)))))))))
(define output (squares (input)))
我不知道如何解决它以及我可以从哪里开始。请帮忙。
答案 0 :(得分:1)
以下是解决方案。 (注意:力是作为驱动功能的一部分完成的)。需要了解的重要一点是" stream"函数(input,squares)返回一个延迟表达式,它是一对2项,其中2nd是另一个延迟表达式,依此类推,force
函数也适用于正常值,因此{{1}中的最后一部分返回3个缺点。
squares
现在您可以像(define input (lambda () (delay (cons (read) (input)))))
(define driver
(lambda (s)
(let ((s (force s)))
(if (null? s) '()
(begin
(display (car s))
(flush-output)
(driver (force (cdr s))))))))
(define squares
(lambda (a)
(delay (cons "please enter a number\n"
(delay (let ((nums (force a)))
(if (null? (car nums)) '()
(cons (* (car nums)
(car nums))
(cons #\newline (squares (cdr nums)))))))))))
一样运行它。要退出提示,用户需要键入空列表(driver (squares (input)))