我是 Scheme 的新手,我正在尝试操作一个列表并返回列表中一对的 cdr。
到目前为止,这是我的代码:
(define get-userid (lambda (ls)
(if (pair? ls)
(cdar ls)
(get-userid (cdar ls)))))
我想操纵的列表是:
(define *rider-preferences4*
'((userid . anna)
(role . rider)
(origin . "southampton")
(destination . "glasgow")
(time . "15:15")
(capacity . 2)
(smoking . no)))
输入和输出:
> get-userid *rider-preferences4*
#<procedure:get-userid>
((userid . anna) (role . rider) (origin . "southampton") (destination . "glasgow") (time . "15:15") (capacity . 2) (smoking . no))
> get-userid (get-userid *rider-preferences4*)
#<procedure:get-userid>
**anna**
我只想要 anna
的结果,并且能够通过调用 get-userid
来完成。这怎么可能?尽管我认为这是微不足道的。
最佳答案
由于 *rider-preferences4*
是一个关联列表,您可以使用特定的 procedures (assoc
, assq
, assv
) 检索任意键:
> (cdr (assq 'userid *rider-preferences4*))
'anna
> (cdr (assq 'destination *rider-preferences4*))
"glasgow"
所以代码是
(define (get-userid alst)
(cdr (assq 'userid alst)))
除了可用于任何键外,它还与位置无关,所以
> (get-userid '((role . rider) (userid . anna)))
'anna
也可以。
关于Scheme 帮助——如何调用一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26568360/