比较lisp中的数字和列表对象

Jos*_*ung 0 lisp

我是lisp的新手,所以如果我提前说这是一个简单的问题,我道歉.

我有一个清单:

(set ‘inventory ‘(parts
                   ((item 1001) (shoes (color brown) (size 10) (cost 20))) 
                   ((item 2011) (skirt (color blue) (size 4) (cost 10)))
                   ((item 2120) (pants (color white) (size 32) (cost 30)))
                   ((item 2121) (pants (color brown) (size 34) (cost 30)))))
Run Code Online (Sandbox Code Playgroud)

我正在尝试编写一个按项目编号查看列表的函数,并返回正确的函数.

(findItem 1001 inventory) 应该返回:

((item 1001) (shoes (color brown) (size 10) (cost 20)))
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止:

(defun findItem (q i)   
    (cond
        ((null q)
         nil)
        ((null (cdr i))
         nil)
        ((eq `parts (car i))
         (findItem q (cdr i)))
        ((eq q (cdr (car (car i))))
         (car i))
        (T
         (findItem q (cdr i)))))
Run Code Online (Sandbox Code Playgroud)

一切似乎都有效 ((eq q (cdr (car (car i)))) (car i))

(cdr (car (car i))) 应返回(1001)或部件号

但是eq没有评估为true,所以函数整体返回nil.

并且将不胜感激

sds*_*sds 5

正如在Common Lisp中eq,eql,equal和equalp之间的区别是什么?, eq用来比较 cons细胞是错误的.您应该使用equal或提取数字,即替换(cdr (car (car i)))为 cadaar您将获得1001而不是(1001).

此外,set已弃用,使用 setq或 defparameter替代.

此外,您可以使用内置 find代替:

(find 1001 (cdr inventory) :key #'cadar)
==> ((ITEM 1001) (SHOES (COLOR BROWN) (SIZE 10) (COST 20)))
Run Code Online (Sandbox Code Playgroud)