Scheme &引用;应用:非程序“;在生成素数时
我试图输出前100个素数,并不断得到错误: 应用:不是一个程序; 应为可应用于参数的过程 给出:(#) 参数…:[无] 错误显示在我的take$过程中:Scheme &引用;应用:非程序“;在生成素数时,scheme,primes,lazy-sequences,sieve,non-procedure-application,Scheme,Primes,Lazy Sequences,Sieve,Non Procedure Application,我试图输出前100个素数,并不断得到错误: 应用:不是一个程序; 应为可应用于参数的过程 给出:(#) 参数…:[无] 错误显示在我的take$过程中: (if (or (= m 0) (null? st)) '() (cons (car st) (take$ (- m 1) ((cdr st))))))) 这是我的全部代码: (define int-builder$ (lambda (x) (list x (lambda () (int-buil
(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)))))
感谢您提供的任何帮助。您的问题是,您在使用抽象筛选的方式上不一致 筛子的定义如下:
;; 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))
你的问题的评论者对每一个问题都侧目的原因是你没有给出一个关于形成筛子和从筛子中提取子部分的规则的高层次定义。像上面这样的数据定义将有助于实现这一点
对我来说,在我添加了数据定义、契约,然后开始单独测试您的函数之后,我很快发现了问题。(提示:这与上面提到的((cdr st))
和((cadr st))
之间的不一致有关。)
这是我的代码版本。它将筛选表示的选择隐藏在抽象接口后面,从而将其本地化;我使用了一个宏来实现这一点,因为流构造函数希望延迟对它接收到的表达式的计算(尽管可以通过更改接口来解决这个问题,因此要求Sieve构造函数采用Sieve生成过程,而不是直接表达式)
读者练习:在当前的api中,如果有人遵循我在代码中给出的数据定义,streamempty?
永远不会返回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))))
;;流是(列表Nat(->()流))
;; 但这一知识不应在任何地方使用,而应在实际应用中使用
;; 程序(和特殊形式)流休息、流优先、流,
;; 而流是空的?。
;; 流休息:流->流
(定义(溪流静止st)((cadr st)))
;; 流优先:流->Nat
(定义(流首街)(车首街))
;; 特殊形式:(stream)是一个stream
(定义语法流)
(语法规则()
((流n expr)(列表n(lambda()expr(()()))))
;; 流->布尔值
(定义(流空?st)(空?st))
;; Nat->Stream
(定义(整数生成器$x)
(流x(整数生成器$(+1 x)))
;; Nat流->[Nat列表]
(定义(以百万美元为单位)
(如果(或(=m 0)(流为空?st))
'()
(反对者(溪流第一街)(以百万美元计)(溪流其余街()())))
;; Nat流->流
(定义(过滤出mults$num st)
(续)
(=(余数(流第一个st)num)0)
(过滤出mults$num(流rest st)))
(其他
(stream(stream first st)(过滤出mults$num(stream rest st()(())())))
;; 流->流
(定义(筛选$st)
(溪流(溪流第一街)
(筛选$(过滤出mults$(流第一个st)(流剩余st()()()))
;; Nat->[Nat列表]
(定义(stol$n)
(取$n(筛元(整数生成器$2)))
您的问题是,您在使用抽象筛选的方式上不一致
筛子的定义如下:
;; 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))
你的问题的评论者对每一个问题都侧目的原因是你没有给出一个关于形成筛子和从筛子中提取子部分的规则的高层次定义。像上面这样的数据定义将有助于实现这一点
对我来说,在我添加了数据定义、契约,然后开始单独测试您的函数之后,我很快发现了问题。(提示:这与上面提到的((cdr st))
和((cadr st))
之间的不一致有关。)
这是我的代码版本。它将筛选表示的选择隐藏在抽象接口后面,从而将其本地化;我使用了一个宏来实现这一点,因为流构造函数希望延迟对它接收到的表达式的计算(尽管可以通过更改接口来解决这个问题,因此要求Sieve构造函数采用Sieve生成过程,而不是直接表达式)
读者练习:在当前的api中,如果有人遵循我在代码中给出的数据定义,streamempty?
永远不会返回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))))
;;流是(列表Nat(->()流))
;; 但这一知识不应在任何地方使用,而应在实际应用中使用
;; 程序(和特殊形式)流休息、流优先、流,
;; 而流是空的?。
;; 流休息:流->流
(定义(溪流静止st)((cadr st)))
;; 流优先:流->Nat
(定义(流首街)(车首街))
;; 特殊形式:(stream)是一个stream
(定义语法流)
(语法规则()
((流n expr)(列表n(lambda()expr(()()))))
;; 流->布尔值
(定义(流空?st)(空?st))
;; Nat->Stream
(定义(整数生成器$x)
(流x(整数生成器$(+1 x)))
;; Nat流->[Nat列表]
(定义(以百万美元为单位)
(如果(或(=m 0)(流为空?st))
'()
(反对者(溪流第一街)(以百万美元计)(溪流其余街()())))
;; Nat流->流
(定义(过滤出mults$num st)
(续)
(=(余数(流第一个st)num)0)
(过滤出mults$num(流rest st)))
(其他
(stream(stream first st)(过滤出mults$num(stream rest st()(())())))
;; 流->流
(定义(筛选$st)
(溪流(溪流第一街)
(筛选$(过滤出mults$(流第一个st)(流剩余st()()()))
;; Nat->[Nat列表]
(定义(stol$n)
(取$n(筛元(整数生成器$2)))
((cdr st))
看起来可疑它只是看起来可疑,作者的