【问题标题】:Looking up pairing lists in scheme在方案中查找配对列表
【发布时间】:2014-07-21 17:48:39
【问题描述】:

我正在尝试编写递归方案函数,该函数返回名称等于给定名称的绑定(对)。如果未找到此类绑定,则返回空列表。关联列表是名称与值的绑定列表:((name1 val1) ... (namet valuet))。

(define (lookup name assoc_list) 
  (cond
    ((null? assoc_list) '())
    ((equal? name (car (car assoc_list))) car(assoc_list))
    (else (lookup name (cdr L)))))

我测试过

(define l1 '( (ben "short") (cara "walking") (dan "bald")))
(lookup (car(car l1)) l1)

它失败了 但如果我这样做了

(define (look name assoc_list) 
  (cond
   ((null? assoc_list) #f)
   ((equal? name (car (car assoc_list))) #t)
   (else (lookup name (cdr L)))))

并在方案中运行它

(define l1 '( (ben "short") (cara "walking") (dan "bald")))
(lookup (car(car l1)) l1)

它返回#t

为什么不归还车(assoc_list) 接下来我要编写一个递归函数(lookup-env 名称环境),它返回一个环境中具有指定名称的绑定(即关联列表的列表),如果没有找到这样的绑定,则返回 null

环境可以由关联列表的列表(即符号表列表)表示,其中列表中的第一个元素是最近的范围,第二个是下一个周围的范围,最后一个是最外层的范围。

【问题讨论】:

  • 您是否考虑接受任何答案?如果没有,现有答案中缺少什么?

标签: scheme


【解决方案1】:

啊,那些括号 ;-) 是 (car assoc_list),而不是 car(assoc_list)

(define (lookup name assoc_list) 
  (cond
    ((null? assoc_list) '())
    ((equal? name (car (car assoc_list))) (car assoc_list)) ; <------
    (else (lookup name (cdr assoc_list)))))

请注意,您可以将(car (car x)) 简化为(caar x)

(define (lookup name assoc_list) 
  (cond
    ((null? assoc_list) '())
    ((equal? name (caar assoc_list)) (car assoc_list))
    (else (lookup name (cdr assoc_list)))))

【讨论】:

    【解决方案2】:

    您正在实现的过程已经存在于一些 Scheme 解释器中,重用现有功能是个好主意(不要重新发明轮子!)。因此lookup 的实现可以这么简单:

    (define (lookup name assoc_list)
      (or (assoc name assoc_list) '()))
    

    诀窍当然是使用assoc(它使用equal? 进行比较)或类似的程序,检查您的解释器的documentation 以发现其他搜索程序。我们需要使用or 来处理未找到绑定的情况,因为默认情况下assoc 在这种情况下返回#f,但您需要'()。让我们测试一下 - 按预期工作:

    (define l1 '( (ben "short") (cara "walking") (dan "bald")))
    
    (lookup 'ben l1)
    => '(ben "short")
    
    (lookup 'tom l1)
    => '()
    

    如果您想从头开始实施该过程,@uselpa 的回答很准确:括号有问题。请记住,要在 Scheme 中调用函数,我们必须这样做:(f x),而不是:f(x)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多