2013-02-10 52 views
0

我試圖輸出前100張質數和不斷收到錯誤:「應用程序:不能在一個過程」,而產生質數

應用程序:不是一個程序; 預期考慮到可以應用到參數的過程 :(#) 參數...:[無]

錯誤在我採取$程序所示:

(if (or (= m 0) (null? st)) 
     '() 
     (cons (car st) (take$ (- m 1) ((cdr st))))))) 

這一切我的代碼:

(define int-builder$ 
    (lambda (x) 
     (list x (lambda() (int-builder$ (+ 1 x)))))) 

(define take$ 
    (lambda (m st) 
     (if (or (= m 0) (null? st)) 
      '() 
      (cons (car st) (take$ (- m 1) ((cdr st))))))) 

(define filter-out-mults$ 
    (lambda (num st) 
    (cond 
    ((= (remainder (car st) num) 0) 
     (filter-out-mults$ num ((cadr st)))) 
     (else 
      (list (car st) (lambda() (filter-out-mults$ num ((cadr st))))))))) 

(define sieve$ 
    (lambda (st) 
    (list (car st) 
      (lambda() (sieve$ (filter-out-mults$ (car st) ((cadr st)))))))) 

(define stol$ 
    (lambda (n) 
     (take$ n (sieve$ (int-builder$ 2))))) 

感謝您提供任何幫助。

+0

'((CDR ST))'看起來可疑 – leppie 2013-02-10 18:37:46

+1

它只是看起來* *懷疑,作者的意圖是去調用CDR封閉。看起來更可疑的是((cadr st))。 – 2013-02-10 18:40:05

+0

錯誤顯示在take $程序中。 – OhioState22 2013-02-10 19:05:51

回答

4

你的問題是,你還沒有如何你一直在使用你的抽象篩一致。

是這樣定義的篩子:

;; 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)))) 
+0

感謝您的解釋。我現在剛剛學習Scheme,這與我習慣的非常不同。謝謝。 – OhioState22 2013-02-10 20:43:04

相關問題