使用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))
答案 0 :(得分:5)
给定非空列表cdr
返回该列表的尾部,即包含列表的所有元素但是第一个列表的列表。需要注意的重要一点是它返回一个列表,而不是一个元素。即(cdr (cdr (cdr x)))
返回列表(2.30733...)
,而不是浮点2.30733
。
答案 1 :(得分:1)
循环迭代外部列表。要理解循环中的代码,您可以查看学生中的第一个元素,即:
'((Abbott Ashley J) 8697387888 NONE 2.3073320999676614)
现在我们要定位清单。每次传递元素时都会添加d
。
每次选择值或转到列表中的列表时,都会添加a
。
要查找如何访问号码2.307 ....您可以查看列表中的第一个元素元素:
d
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有help
,where
,backtrace
等命令来进一步调查问题。只需键入help
并返回,而不返回任何其他内容,您会看到一个命令列表。