Scheme 获取列表列表中的第二项
我有一个通过嵌套的Scheme 获取列表列表中的第二项,scheme,lisp,Scheme,Lisp,我有一个通过嵌套的cons生成的列表,它创建了这样一个结构——我在下面创建了一个示例列表 (定义lst'((name.test.15)) 我希望稍后使用assq筛选名称,然后访问每个名称的值。例如,在上面的例子中,我希望能够做一些时尚的事情(伪代码): if(cdr(assq'name lst2)=test,打印值[15] 怎么做?我只能做(assq'name(car(lst)))若要返回正确的名称,但随后我将无法访问值15您需要编写自己的类assoc过程。一个具有提取要比较的内容的键函数,或者
cons
生成的列表,它创建了这样一个结构——我在下面创建了一个示例列表
(定义lst'((name.test.15))
我希望稍后使用assq
筛选名称,然后访问每个名称的值。例如,在上面的例子中,我希望能够做一些时尚的事情(伪代码):
if(cdr(assq'name lst2)=test,打印值[15]
怎么做?我只能做
(assq'name(car(lst)))
若要返回正确的名称,但随后我将无法访问值15您需要编写自己的类assoc
过程。一个具有提取要比较的内容的键函数,或者一个具有可执行此操作的通用测试函数,或者两者兼而有之。下面是一个允许通用测试函数的程序:
(define (asst o l test)
;; test is called on o and the element of l in that order
(if (null? l)
#f
(let ((f (car l))
(r (cdr l)))
(if (test o f)
f
(asst o r test)))))
现在呢
> (asst 'name '(((name . test) . 15))
(lambda (o el)
(eqv? o (car (car el)))))
'((name . test) . 15)
> (findfv '(((name . fred) . 12) ((feature . legs) 8) ((name . josephine) . 15)) 'name 'josephine)
'((name . josephine) . 15)
> (findfv '(((name . fred) . 12) ((feature . legs) 8) ((name . josephine) . 15)) 'feature 'legs)
'((feature . legs) 8)
如果您想在列表上执行更一般的测试,那么有一个名为find
的通用函数可以执行此操作,但它很容易实现:
(define (find pred? l)
(cond
((null? l)
#f)
((pred? (first l))
(first l))
(else
(find pred? (rest l)))))
给定find
后,编写一个函数就很容易了,该函数可以查找结构中的特定键和值:
(define (findfv l field value)
(find (λ (e)
(and (eqv? (car (car e)) field)
(eqv? (cdr (car e)) value)))
l))
现在呢
> (asst 'name '(((name . test) . 15))
(lambda (o el)
(eqv? o (car (car el)))))
'((name . test) . 15)
> (findfv '(((name . fred) . 12) ((feature . legs) 8) ((name . josephine) . 15)) 'name 'josephine)
'((name . josephine) . 15)
> (findfv '(((name . fred) . 12) ((feature . legs) 8) ((name . josephine) . 15)) 'feature 'legs)
'((feature . legs) 8)
(在CL中,提供的
assoc
功能同时允许测试和按键选项)(assoc'(name.test)lst)
?