在Lisp中将列表元素作为整数返回

时间:2014-05-15 19:22:10

标签: lisp

我应该编写一个函数来接收列表,从列表中提取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笔记十几次,以及幻灯片,我完全没有办法将数据从列表中删除。有人能给我一些指导吗?

2 个答案:

答案 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)

如果您使用firstsecondrest函数,可能会减少混淆:

(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)))