【问题标题】:Prime Number in Common LispCommon Lisp 中的质数
【发布时间】:2016-01-23 06:15:02
【问题描述】:

嗯,我对 Common Lisp 编程语言完全陌生,我从昨天开始自己学习这门语言,这太出于兴趣了。现在,当我遇到函数和循环时,在了解了它们之后,我开始开发Common Lisp 中的素数问题。 我的代码如下:

(defun prime (num)

(setq c 1)

(setq a 2)

(loop 

(setq a (+ 1 a))

(if (= (mod num a) 0)

(setq c (+ c 1))

)

(when (> (+ a 1) 17) (return a))

)
)

(if (= c 1)
(return-from prime num)
)
)

(loop for x from 1 to 20
do (prime x)
)

现在我使用这段代码面临的问题是,每当我尝试执行这段代码时,我得到的错误如下:

***IF: 变量 C 没有值

但我已经为 c 声明了一个值,它仍然出现。所以我只想知道为什么这个错误会出现,即使我已经声明了它。

【问题讨论】:

  • 在任何编程语言中,您都需要对代码进行格式化和缩进以使其可读。在 Lisp 中也是如此。请不要将未格式化的代码放入问题中。
  • @user242453 (setq a (+ 1 a)),可以替换为(incf a)。还有一个1+函数用于编写(+ 1 _)

标签: common-lisp


【解决方案1】:

当要求 Emacs 根据括号深度重新缩进你的代码时,错误的原因立即显而易见:

(defun prime (num)
  (setq c 1)
  (setq a 2)
  (loop 
     (setq a (+ 1 a))
     (if (= (mod num a) 0)
     (setq c (+ c 1)))
     (when (> (+ a 1) 17) (return a))))
(if (= c 1)
    (return-from prime num)))
(loop for x from 1 to 20
   do (prime x))

如您所见,您的(if (= c 1) (return-from prime num)) 只是在您的prime 函数之外,当它作为加载文件的一部分被评估时,它会尝试评估c,这确实是未绑定的,因为这是在绑定c 的任何范围之外。

您可能希望使用可以突出显示括号对的编辑器,以便更轻松地避免这些问题。

另一方面,您可能希望使用(let) 而不是(setq),为您提供正确的词法绑定。你的程序目前的编写方式,ca 本质上是全局变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    • 2017-10-19
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    相关资源
    最近更新 更多