1

首先我会提出问题。

假设将输入定义为一个返回“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)))))))

注意使用武力。

展示如何编写函数 squares,使其接受 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)))

我不知道如何解决它以及我可以从哪里开始。请帮忙。

4

1 回答 1

1

下面是解决方案。(注意:力是作为驱动程序功能的一部分完成的)。要理解的重要一点是,“流”函数(输入,正方形)返回一个延迟表达式,它是一对 2 项,其中第 2 项是另一个延迟表达式,依此类推,该force函数也适用于正常值,因此最后一个部分squares回报 3 个缺点项目。

(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)))。要退出提示,用户需要输入空列表()

于 2013-04-08T12:08:38.100 回答