2013-04-08 46 views
1

首先我會提出問題。方案:交互式I/O的延遲和強制

假設定義輸入要返回一個「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))))))) 

注意,使用武力。

顯示如何編寫函數方塊,以便將istream作爲參數並返回一個ostream。你應該能夠輸入(驅動程序(方塊(輸入)))並查看適當的行爲。

書中的正方形在上面。

(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

下面是解決方案。 (注意:力是作爲驅動程序功能的一部分完成的)。重要的是要理解的是,「流」函數(輸入,正方形)返回一個延遲表達式,它是一對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)))。要退出提示用戶需要鍵入空列表()