方案错误 "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)))