我应该编写一个函数来接收列表,从列表中提取ID号,然后将其作为整数(不是列表)返回。
我的第一个功能非常简单:
(defun idReturn2 (l) (if (eq (car l) '(ID)) (cadr l) (idReturn list)))
我用函数调用了它:
(idReturn2 '((name (light bulb)) (mfgr ge) (watts 60) (id 357) (quantity 6)))
该方法应该返回357,而是返回(357)。它是正确的返回号码,但它是列表的一部分,我的教授直接告诉我们不要这样做。
我注意到我的二次方程函数只返回没有括号的整数,所以我想我可以用解析整数解析整数:
(defun idReturn2 (l) (if (eq (car l) '(ID)) (parse-integer (cadr l)) (idReturn list)))
仍然返回(357)。我已经超过了我的lisp笔记十几次,以及幻灯片,我完全没有办法将数据从列表中删除。有人能给我一些指导吗?
答案 0 :(得分:1)
如果该列表以参数((property-name1 value1) (property-name2 value2) ...)
的形式给出,那么您有一个列表l
,那么(car l)
不是(property-name1)
而是(property-name1 value1)
。幸运的是,您会看到您应该检查的符号位于结果第一个元素中,这意味着您应该使用(car (car l))
或(caar l)
。 (eq (caar l) 'property-name1) ; ==> t
请注意,当您在第一次迭代中找不到它时,您会调用一个完全不同的函数IdReturn
,而不是l
的其余部分,而是另一个变量list
(无论如何)是)。你没有提供它所以我不知道你如何得到(357)
,但它不是你问题中提供的功能。
PS:任何列表(a)
(a b)
或(a b c)
您使用car
提取第一个值。 (car '(357)) ;==> 357
答案 1 :(得分:0)
如果您使用first
,second
和rest
函数,可能会减少混淆:
(defun idReturn (l)
(when l
(let ((c (first l)))
(if (eq (first c) 'id)
(second c)
(idReturn (rest l))))))
与
相同(defun idReturn (l)
(when l
(let ((c (car l)))
(if (eq (car c) 'id)
(cadr c)
(idReturn (cdr l))))))
然后
? (idReturn '((name (light bulb)) (mfgr ge) (watts 60) (id 357) (quantity 6)))
357
? (idReturn '((name (light bulb)) (mfgr ge) (watts 60) (idx 357) (quantity 6)))
NIL
请注意,使用assoc
,您可以将功能简化为
(defun idReturn (l)
(second (assoc 'id l)))