【问题标题】:Scheme help - how to call a function方案帮助 - 如何调用函数
【发布时间】:2014-10-25 23:39:21
【问题描述】:

我是 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 来实现。这怎么可能?尽管我认为它是微不足道的。

【问题讨论】:

标签: scheme lisp racket evaluate function-call


【解决方案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

也可以。

【讨论】:

    【解决方案2】:

    我觉得你对Scheme中列表操作的工作方式有点困惑,我建议你看看documentation中的相关部分。对于这个问题,解决方法就这么简单:

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

    解释:输入列表是对的列表,我们对第一个元素的cdr 部分感兴趣(它包含用户ID)。所以我们取carcdr,或者缩写:cdar。它按预期工作:

    (get-userid *rider-preferences4*)
    => 'anna
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-25
      相关资源
      最近更新 更多