scheme:交互式I / O的延迟和强制

时间:2013-04-08 05:34:59

标签: scheme

首先我会提问。

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

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

1 个答案:

答案 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)))