在计划中查找配对列表

时间:2014-07-21 17:48:39

标签: scheme

我正在尝试编写递归方案函数,该函数返回其名称等于给定名称的绑定(对)。如果未找到此类绑定,则返回空列表。关联列表是名称与值绑定的列表:((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

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

2 个答案:

答案 0 :(得分:2)

啊那些括号;-)它是(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)))))

答案 1 :(得分:1)

您正在实施的程序已经存在于某些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)