大家好,我是编程新手,我必须像这样使用关联列表
((course (john .math) (jim .english) (carl .biology) )
(year (john .2) (jim. 1) (carl .3))
(age (john .22) (jim .20) (carl .27))
)
我应该使用匹配器来像函数查找那样工作
(lookup 'john 'course data) and return math
现在我是编程新手,对 Lisp 完全陌生,需要为学校做这件事。现在我不需要完整的解决方案,而是一些想法或说明。
这就是我到目前为止所拥有的,但花了我很多时间
如果有人能提供帮助,我们将不胜感激!!!!
(defun lookup (name course data)
(matches '(name course data) '(first course ))
)
首先让我们将数据放入一个名为data
的列表中。注意列表需要是quoted通过 '
,并且 .
dot signs需要被空格包围,因为它们有自己的含义:
(defparameter *data* '((course (john . math) (jim . english) (carl . biology))
(year (john . 2) (jim . 1) (carl . 3))
(age (john . 22) (jim . 20) (carl . 27))))
现在让我们尝试使用程序 assoc
:
? *data*
((COURSE (JOHN . MATH) (JIM . ENGLISH) (CARL . BIOLOGY)) (YEAR (JOHN . 2) (JIM . 1) (CARL . 3)) (AGE (JOHN . 22) (JIM . 20) (CARL . 27)))
? (assoc 'course *data*)
(COURSE (JOHN . MATH) (JIM . ENGLISH) (CARL . BIOLOGY))
? (cdr (assoc 'course *data*))
((JOHN . MATH) (JIM . ENGLISH) (CARL . BIOLOGY))
? (assoc 'john (cdr (assoc 'course *data*)))
(JOHN . MATH)
? (cdr (assoc 'john (cdr (assoc 'course *data*))))
MATH
所以函数变成了
(defun lookup (name attr data)
(cdr (assoc name (cdr (assoc attr data)))))
(lookup 'john 'course *data*)
=> MATH
(lookup 'carl 'age *data*)
=> 27
我是一名优秀的程序员,十分优秀!