你的問題是,你還沒有如何你一直在使用你的抽象篩一致。
是這樣定義的篩子:
;; A Sieve is a (cons n p), where
;; n is a Natural Number
;; p is a Procedure that takes no arguments and returns a Sieve
,或者像這樣
;; A Sieve is a (list n p), where
;; n is a Natural Number
;; p is a Procedure that takes no arguments and returns a Sieve
在代碼中有些地方規定,要解壓縮的P和調用它像這樣: ((cdr st))
;在其他地方,像這樣:((cadr st))
你們問題上的評論者們單獨看待每一個人的原因是,你們沒有給出關於形成Sieves和提取子部分的規則的高級定義來自Sieves。像上面那樣的數據定義將有助於這一點。
對於我來說,當我加入的數據定義,合同,然後開始單獨測試你的職責,我很快就發現了問題。 (提示:這與上面提到的((cdr st))
和((cadr st))
之間的不一致有關。)
這是我的代碼版本。它將Sieve表示的選擇隱藏在抽象接口的後面;我使用了一個宏來做到這一點,因爲流構造函數想要延遲對它接收到的表達式的評估(儘管可以通過改變接口來解決這個問題,所以Sieve構造函數被要求採用產生篩的過程而不是直接表達式) 。
練習爲讀者:在當前的API,如果有人通過我在此代碼已經給出了數據定義,stream-empty?
永遠不能返回true;你怎麼能證明這一點?
;; A Stream is a (list Nat (->() Stream))
;; but this knowledge should not be used anywhere but in the
;; procedures (and special form) stream-rest, stream-first, stream,
;; and stream-empty?.
;; stream-rest: Stream -> Stream
(define (stream-rest st) ((cadr st)))
;; stream-first: Stream -> Nat
(define (stream-first st) (car st))
;; Special Form: (stream <natural-number> <stream-expr>) is a Stream
(define-syntax stream
(syntax-rules()
((stream n expr) (list n (lambda() expr)))))
;; Stream -> Boolean
(define (stream-empty? st) (null? st))
;; Nat -> Stream
(define (int-builder$ x)
(stream x (int-builder$ (+ 1 x))))
;; Nat Stream -> [Listof Nat]
(define (take$ m st)
(if (or (= m 0) (stream-empty? st))
'()
(cons (stream-first st) (take$ (- m 1) (stream-rest st)))))
;; Nat Stream -> Stream
(define (filter-out-mults$ num st)
(cond
((= (remainder (stream-first st) num) 0)
(filter-out-mults$ num (stream-rest st)))
(else
(stream (stream-first st) (filter-out-mults$ num (stream-rest st))))))
;; Stream -> Stream
(define (sieve$ st)
(stream (stream-first st)
(sieve$ (filter-out-mults$ (stream-first st) (stream-rest st)))))
;; Nat -> [Listof Nat]
(define (stol$ n)
(take$ n (sieve$ (int-builder$ 2))))
'((CDR ST))'看起來可疑 – leppie 2013-02-10 18:37:46
它只是看起來* *懷疑,作者的意圖是去調用CDR封閉。看起來更可疑的是((cadr st))。 – 2013-02-10 18:40:05
錯誤顯示在take $程序中。 – OhioState22 2013-02-10 19:05:51