Scheme帮助 - 如何调用函数

时间:2014-10-25 23:39:22

标签: scheme lisp racket evaluate function-call

我是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即可。这怎么可能?即使我认为它是微不足道的。

2 个答案:

答案 0 :(得分:1)

我认为您对计划中列表操作的工作方式有点困惑,我建议您查看documentation中的相关部分。对于这个问题,解决方案就像这样简单:

(define get-userid ; even simpler: (define get-userid cdar)
  (lambda (ls)
    (cdar ls)))

说明:输入列表是对列表,我们对第一个元素的cdr部分感兴趣(其中包含用户ID)。我们采用cdr的{​​{1}}或缩写:car。它按预期工作:

cdar

答案 1 :(得分:1)

由于*rider-preferences4*是一个关联列表,您可以使用特定的proceduresassocassqassv)来检索任何密钥:

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

也可以。