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)