lisp - 匹配器关联列表 lisp

标签 lisp matcher

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

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

关于lisp - 匹配器关联列表 lisp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20095818/

相关文章:

windows - 在 Windows 上运行 RMCL (Lisp)

java - 获取具有特定前缀的整数 [Java]

Java 正则表达式匹配器

java - 模式语法异常,索引 0 附近的悬挂元字符 '+'

Java递归(?)重复(?)深度(?)模式匹配

tree - 使用搜索找到树中最深的节点,然后移动它

list - 使用递归将整数转换为 LISP 中的二进制列表

Lisp 风格 : setq vs. setf

foreach - Lisp,为列表中的每个元素做一些事情

java - 当正则表达式与较大的字符串匹配时获取子匹配