Lisp,为什么这个数字不是浮点数

时间:2013-11-20 22:46:28

标签: common-lisp clisp

使用Common Lisp我正在尝试循环学生列表,如果GPA大于或等于3.0,我想将1推到另一个名为equal_names的列表中。我遇到的问题是解释器一直说比较列表中的GPA是“不属于类型(或理性浮点数)”。为什么我会收到此错误?

是的,这是作业。这也是我第一次在这里问,所以如果你还需要什么,请告诉我。

我从GPA获得GPA的列表示例,其中GPA是2.307 ......:

(SETQ students (LIST  
    (LIST (LIST 'Abbott 'Ashley 'J) '8697387888 'NONE 2.3073320999676614))) 

我写的代码:

(setq gpa_count ())  

    (loop for x in students 
        if(>=  3.0 (cdr (cdr (cdr x))))  
            do(push '1 gpa_count))

4 个答案:

答案 0 :(得分:5)

给定非空列表cdr返回该列表的尾部,即包含列表的所有元素但是第一个列表的列表。需要注意的重要一点是它返回一个列表,而不是一个元素。即(cdr (cdr (cdr x)))返回列表(2.30733...),而不是浮点2.30733

答案 1 :(得分:1)

循环迭代外部列表。要理解循环中的代码,您可以查看学生中的第一个元素,即:

'((Abbott Ashley J) 8697387888 NONE 2.3073320999676614)

现在我们要定位清单。每次传递元素时都会添加d。 每次选择值或转到列表中的列表时,都会添加a

要查找如何访问号码2.307 ....您可以查看列表中的第一个元素元素:

  • (Abbott Ashley J)d
  • 8697387888 d
  • d

现在我们处于你感兴趣的部分,即。 (2.3073320999676614)),因此您添加a。现在以相反的顺序排序,并在前面加c,在最后放r ..它变成cadddr根据你的循环应该是:

(setq students '(("Mary Larson" 333 NONE 1.1)
                 ("Mina Morson" 333 NONE 2.5) 
                 ("Magnus Outsider" 333 NONE 4.1)))
(setq gpa_count ())

(loop for x in students 
      if (>=  3.0 (cadddr x))   
      do (push '1 gpa_count))
gpa_count ; ==> (1 1) 

另一个例子:

(setq x (1 (2 3) (3 4 (5 6) 7))) ; ==> (1 (2 3) (3 4 (5 6) 7))

获得3 *。我们遵循这些部分。 1 == d,(2 3)== a,2 == d,3 * == a。反过来:adad并将c和r添加到两端==> cadadr。因此:

(cadadr '(1 (2 3) (3 4 (5 6) 7))) ; ==> 3

要获得5.我们做同样的1 == d,(2 3)== d然后我们有我们想要的列表== a。 然后3 == d,4 == d,(5 6)== a。 5是第一个元素== a。反过来aaddadd。现在CL保证4个字母访问器,所以我们需要从右边分成4s。因此它变成了:

(caadr (cdaddr '(1 (2 3) (3 4 (5 6) 7)))) ; ==> 5

现在,没有描述你可以选择任何数字或列表。例如。得到(5 6) ddadda,反之并分为(cadr (cdaddr x))

希望它有所帮助。

答案 2 :(得分:1)

如果您的数据格式一致,那么

(fourth x)

将返回GPA。

更进一步,

(setf (symbol-function 'gpa)(function fourth))

会提供

(gpa x)

作为数据结构中gpa的“访问者”。

答案 3 :(得分:0)

我的CLISP 2.49给出了以下错误消息:

*** - >=: (2.307332) is not a real number

让我们看看该错误消息:> = (2.307332)不是实数。

错误发生在调用>=时,一个参数是一个数字列表,而不是数字。

由于您尝试从列表中提取数字,该提取是否有效?

我们看到您致电CDR。列表的CDR返回一个列表。所以有错误。您需要从列表中提取数字。

顺便说一下,CLISP有helpwherebacktrace等命令来进一步调查问题。只需键入help并返回,而不返回任何其他内容,您会看到一个命令列表。