匹配关联列表lisp

时间:2013-11-20 12:19:36

标签: lisp matcher

大家好我是编程新手,我必须像这样使用关联列表

((course (john .math) (jim .english) (carl .biology) )
 (year (john .2) (jim. 1) (carl .3))
 (age (john .22) (jim .20) (carl .27))
)

我应该使用matcher来使用函数查找

(lookup 'john 'course data) and return math

现在我是编程新手,对Lisp来说是全新的,需要为学校做这件事。现在我不需要一个完整的解决方案,但需要一些想法或指示。

这是我到目前为止所拥有的,但花了我很多时间

如果有人可以提供帮助,将非常感谢!!!!

(defun lookup (name course data)

(matches '(name course data) '(first course  )) 

)

1 个答案:

答案 0 :(得分:4)

首先让我们将数据放入名为data的列表中。请注意列表需要' (defparameter *data* '((course (john . math) (jim . english) (carl . biology)) (year (john . 2) (jim . 1) (carl . 3)) (age (john . 22) (jim . 20) (carl . 27)))) ,并且quoted需要被空格包围,因为它们具有自己的含义:

? *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

现在让我们尝试使用. dot signs程序:

(defun lookup (name attr data)
  (cdr (assoc name (cdr (assoc attr data)))))

(lookup 'john 'course *data*) 
=> MATH

(lookup 'carl 'age *data*) 
=> 27

所以功能变为

{{1}}