Lisp 中是否有一个函数的工作方式与 assoc
与关联列表的工作方式相同,但适用于扁平的有序列表和一组具有隐式排序的元组?例如,我有一个扁平的无序列表和一个查找函数:
(defparameter *data2* '((alf age 55 year 2 course lisp)
(sue age 22 year 3 course java)
(ralf age 16 year 1 course lisp)
(alf age 8 year 2 course lisp)))
(defun lookup (name course data)
(cdr (assoc name (cdr (assoc course data)))))
当被调用时,lookup
函数就像:
(lookup 'alf 'course *data*) ==> get lisp
现在,使用“具有隐式顺序的元组”(即,值始终以相同顺序排列的值列表):
(defparameter *data3* '((alf 55 lisp 2)
(sue 22 java 3)
(ralf 16 lisp 1)
(alf 8 lisp 2)))
对于关联列表,是否有任何函数的工作方式与 assoc
相同,但对于平面无序列表和具有隐式顺序的元组?
最佳答案
不确定我是否完全理解你;是这样的吗?
(defun lookup (name attr data)
(mapcar (lambda (x) (cadr (member attr x)))
(remove-if-not (lambda (x) (eq name (car x))) data)))
然后
? (lookup 'alf 'course *data2*)
(LISP LISP)
? (lookup 'alf 'age *data2*)
(55 8)
?(lookup 'ralf 'year *data2*)
(1)
对于你的另一个例子:
(defun lookup (name attr data)
(mapcar (lambda (x) (nth attr x))
(remove-if-not (lambda (x) (eq name (car x))) data)))
然后
(lookup 'alf 2 *data3*)
(lookup 'alf 1 *data3*)
(lookup 'ralf 3 *data3*)
关于list - 具有隐式顺序 lisp 的平面无序列表和元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20101191/