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

Common lisp Lisp,为什么这个数字不是浮点数,common-lisp,clisp,Common Lisp,Clisp,使用Common Lisp,我尝试循环浏览学生列表,如果GPA大于或等于3.0,我想将1推到另一个名为equal_names的列表上。我遇到的问题是,解释器一直说比较列表中的GPA“不是类型(或rational float)”。为什么我会犯这个错误 是的,这是家庭作业。这也是我第一次在这里询问,所以如果你还需要什么,请告诉我 我获得GPA的名单样本,其中GPA为2.307…: (SETQ students (LIST (LIST (LIST 'Abbott 'Ashley 'J) '

使用Common Lisp,我尝试循环浏览学生列表,如果GPA大于或等于3.0,我想将1推到另一个名为equal_names的列表上。我遇到的问题是,解释器一直说比较列表中的GPA“不是类型(或rational float)”。为什么我会犯这个错误

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

我获得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))

给定一个非空列表
cdr
返回该列表的尾部,即包含列表中除第一个元素以外的所有元素的列表。需要注意的重要一点是,它返回的是一个列表,而不是一个元素。这就是
(cdr(cdr(cdr(cdr x))
返回列表
(2.30733…
),而不是浮动
2.30733
,给定一个非空列表
cdr
返回该列表的尾部,即包含列表中除第一个以外的所有元素的列表。需要注意的重要一点是,它返回的是一个列表,而不是一个元素。也就是说
(cdr(cdr(cdr x))
返回列表
(2.30733…
),而不是浮点
2.30733
,循环迭代外部列表。要理解循环中的代码,您可以查看students中的第一个元素,即:

'((Abbott Ashley J) 8697387888 NONE 2.3073320999676614)
现在,我们将确定列表的方向。每次传递一个元素时,添加一个
d
。 每次选择值或转到列表中的列表时,都会添加一个
a

要了解如何访问号码2.307。。。。您将看到列表中的第一个元素:

  • (艾伯特·阿什利J)
    d
  • 8697387888
    d
  • d
现在我们是您感兴趣的部分,即
(2.307332099676614)
),因此您添加了
a
。现在按相反顺序排列,前面放一个
c
,最后放一个
r
。。它变为
CADDR
,因为您的循环应该是:

(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
,(23)=
a
,2=
d
,3*==a。相反:
adad
并将c和r添加到末尾==>
cadadr
。因此:

(cadadr '(1 (2 3) (3 4 (5 6) 7))) ; ==> 3
去拿5。我们做同样的1==d,(23)==d,然后我们得到我们想要的列表==a。 然后3==d,4==d,(56)==a。5是第一个元素==a。相反,aaddadd。现在CL保证4个字母的访问器,所以我们需要从右边将其分成4个字母。因此,它变成:

(caadr (cdaddr '(1 (2 3) (3 4 (5 6) 7)))) ; ==> 5
现在,无需描述,您可以选择任何数字或列表。例如,要获得
(5 6)
dda,则反向拆分为
(cadr(cdaddr x))


希望有帮助。

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

'((Abbott Ashley J) 8697387888 NONE 2.3073320999676614)
现在,我们将确定列表的方向。每次传递一个元素时,添加一个
d
。 每次选择值或转到列表中的列表时,都会添加一个
a

要了解如何访问号码2.307。。。。您将看到列表中的第一个元素:

  • (艾伯特·阿什利J)
    d
  • 8697387888
    d
  • d
现在我们是您感兴趣的部分,即
(2.307332099676614)
),因此您添加了
a
。现在按相反顺序排列,前面放一个
c
,最后放一个
r
。。它变为
CADDR
,因为您的循环应该是:

(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
,(23)=
a
,2=
d
,3*==a。相反:
adad
并将c和r添加到末尾==>
cadadr
。因此:

(cadadr '(1 (2 3) (3 4 (5 6) 7))) ; ==> 3
去拿5。我们做同样的1==d,(23)==d,然后我们得到我们想要的列表==a。 然后3==d,4==d,(56)==a。5是第一个元素==a。相反,aaddadd。现在CL保证4个字母的访问器,所以我们需要从右边将其分成4个字母。因此,它变成:

(caadr (cdaddr '(1 (2 3) (3 4 (5 6) 7)))) ; ==> 5
现在,无需描述,您可以选择任何数字或列表。例如,要获得
(5 6)
dda,则反向拆分为
(cadr(cdaddr x))


希望有帮助。

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

(fourth x)
将返回GPA

进一步说,

(setf (symbol-function 'gpa)(function fourth))
将提供

(gpa x)

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

如果数据格式一致,则

(fourth x)
将返回GPA

进一步说,

(setf (symbol-function 'gpa)(function fourth))
将提供

(gpa x)

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

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

*** - >=: (2.307332) is not a real number
让我们看一下错误消息:=(2.307332)不是实数

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

既然您试图从列表中提取数字,那么这种提取方法有效吗

我们看到您调用了
CDR
<列表的code>CDR返回一个列表。这就是错误所在。您需要从列表中提取号码


顺便说一句,CLISP有像
help
where
backtrace
。。。进一步调查这个问题。只需键入
help
并返回,无需其他任何操作,即可看到命令列表。

My CLISP 2.49给出以下错误消息:

*** - >=: (2.307332) is not a real number
让我们看一下错误消息:=(2.307332)不是实数

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

既然您试图从列表中提取数字,那么这种提取方法有效吗

我们看到您调用了
CDR
<列表的code>CDR返回一个列表。这就是错误所在。您需要从列表中提取号码。