我正在尝试编写递归方案函数,该函数返回其名称等于给定名称的绑定(对)。如果未找到此类绑定,则返回空列表。关联列表是名称与值绑定的列表:((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
环境可以由关联列表列表(即符号表列表)表示,其中列表中的第一个元素是最近的范围,第二个元素是下一个环绕范围,最后一个是最外面的范围。
答案 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)
。