方案错误 "application: not a procedure"
Scheme Error "application: not a procedure"
我正在阅读 sicp 并且正在编写一个程序来从 1,000 中找出前 3 个素数。我正在使用 Fermat 方法的修改版本(但是在这种情况下算法无关紧要,因为我只需要了解错误消息)。整套代码为:
(define (fz-prime number count)
(if (< count 4)
(if (= (fz-fermat-loop number 1) 0)
(fz-prime (+ number 1) count)
((display number) (fz-prime (+ number 1) (+ count 1))))))
(define (fz-fermat-loop number count)
count
(if (> count 5)
1
(if (= (fz-fermat-test number (fz-random number)) 0)
0
(fz-fermat-loop number (+ count 1)))))
(define (fz-fermat-test number count)
(if (= (modulo count number) (modulo (fz-exp-wrapper count number) number))
1
0))
(define (fz-random number)
(random (- number 2)))
(define (fz-exp-wrapper base power)
(fz-exp base power 1))
(define (fz-exp base power result)
(if (<= power 0) result
(fz-exp base (- power 1) (* result base))))
(fz-prime 1000 1)
现在每次我 运行 代码时,它都会显示以下错误:
100910131019. . application: not a procedure;
expected a procedure that can be applied to arguments
given: #<void>
arguments...:
前三个数是前三个质数,但我不明白错误信息是什么意思。
错误消息表明您正在使用 Racket,但也表明您选择了一种语言级别,该语言级别禁用了有用的错误消息,例如当我将您的程序复制到 #lang racket 语言的缓冲区时收到的错误消息:
if: missing an "else" expression in: (if (< count 4) (if (= (fz-fermat-loop number 1) 0)
(fz-prime (+ number 1) count) ((display number) (fz-prime (+ number 1) (+ count 1)))))
实际上,我敢打赌您正在使用 Jens Axel Soegaard 出色的 sicp
语言,这完全是通过 sicp 工作的正确选择....但不幸的是缺少一些有用的错误消息。
具体来说,在您使用的语言中,if
可能会缺少 else
分支,如果测试失败,它会自动评估特殊的 # 值。
哦!可是等等!你还有一个问题……你写
((display number) (fz-prime (+ number 1) (+ count 1)))
我打赌你在想,如果你只是用两个表达式,比如 (display number)
和 (fz-prime ...)
并将它们用括号括起来,这意味着 "do the first, then do the second." 实际上,这意味着"the first expression evaluates to a function; call it with the arguments that result from evaluating the remaining expressions" 和 #void
正是 (display ...)
returns。
您可能正在寻找 begin
,在这里,像这样:
(begin
(display number)
(fz-prime (+ number 1) (+ count 1)))
我正在阅读 sicp 并且正在编写一个程序来从 1,000 中找出前 3 个素数。我正在使用 Fermat 方法的修改版本(但是在这种情况下算法无关紧要,因为我只需要了解错误消息)。整套代码为:
(define (fz-prime number count)
(if (< count 4)
(if (= (fz-fermat-loop number 1) 0)
(fz-prime (+ number 1) count)
((display number) (fz-prime (+ number 1) (+ count 1))))))
(define (fz-fermat-loop number count)
count
(if (> count 5)
1
(if (= (fz-fermat-test number (fz-random number)) 0)
0
(fz-fermat-loop number (+ count 1)))))
(define (fz-fermat-test number count)
(if (= (modulo count number) (modulo (fz-exp-wrapper count number) number))
1
0))
(define (fz-random number)
(random (- number 2)))
(define (fz-exp-wrapper base power)
(fz-exp base power 1))
(define (fz-exp base power result)
(if (<= power 0) result
(fz-exp base (- power 1) (* result base))))
(fz-prime 1000 1)
现在每次我 运行 代码时,它都会显示以下错误:
100910131019. . application: not a procedure;
expected a procedure that can be applied to arguments
given: #<void>
arguments...:
前三个数是前三个质数,但我不明白错误信息是什么意思。
错误消息表明您正在使用 Racket,但也表明您选择了一种语言级别,该语言级别禁用了有用的错误消息,例如当我将您的程序复制到 #lang racket 语言的缓冲区时收到的错误消息:
if: missing an "else" expression in: (if (< count 4) (if (= (fz-fermat-loop number 1) 0)
(fz-prime (+ number 1) count) ((display number) (fz-prime (+ number 1) (+ count 1)))))
实际上,我敢打赌您正在使用 Jens Axel Soegaard 出色的 sicp
语言,这完全是通过 sicp 工作的正确选择....但不幸的是缺少一些有用的错误消息。
具体来说,在您使用的语言中,if
可能会缺少 else
分支,如果测试失败,它会自动评估特殊的 # 值。
哦!可是等等!你还有一个问题……你写
((display number) (fz-prime (+ number 1) (+ count 1)))
我打赌你在想,如果你只是用两个表达式,比如 (display number)
和 (fz-prime ...)
并将它们用括号括起来,这意味着 "do the first, then do the second." 实际上,这意味着"the first expression evaluates to a function; call it with the arguments that result from evaluating the remaining expressions" 和 #void
正是 (display ...)
returns。
您可能正在寻找 begin
,在这里,像这样:
(begin
(display number)
(fz-prime (+ number 1) (+ count 1)))