方案错误"申请:不是程序"

时间:2018-05-04 03:13:06

标签: function scheme function-call application-error

我正在阅读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...:

前3个数字是前三个素数,但我不知道错误信息的内容。

1 个答案:

答案 0 :(得分:2)

错误消息表明您正在使用Racket,但您还选择了禁用有用错误消息的语言级别,例如我在#lang中将程序复制到缓冲区时所获得的错误消息球拍语言:

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 ...)之类的两个表达并将它们包裹在parens中,这意味着&#34;做第一个,然后执行第二&#34。实际上,这意味着&#34;第一个表达式求值为一个函数;用它来评估剩余的表达式&#34;来调用它。而#void正是(display ...)返回的内容。

您可能正在寻找begin,就像这样:

(begin 
   (display number) 
   (fz-prime (+ number 1) (+ count 1)))