Functional programming Scheme-为关联列表编写绑定函数?

Functional programming Scheme-为关联列表编写绑定函数?,functional-programming,scheme,racket,Functional Programming,Scheme,Racket,我正在尝试在Scheme中编写一个函数,该函数使用set创建一个关联列表 该函数将接受三个参数:键、值和关联列表,并返回新的关联列表。我的代码如下: (define al '((A 1) (B 2) (C 3))) (define (bind k v al) (cond ((null? al) set! al '((k v))) (else (set-car! al '(k v))))) 我希望代码按如下方式工作: (define al '((A 1) (

我正在尝试在Scheme中编写一个函数,该函数使用
set创建一个关联列表

该函数将接受三个参数:键、值和关联列表,并返回新的关联列表。我的代码如下:

(define al '((A 1) (B 2) (C 3)))

(define (bind k v al)
    (cond
       ((null? al) set! al '((k v)))
       (else (set-car! al '(k v)))))
我希望代码按如下方式工作:

(define al '((A 1) (B 2) (C 3)))

(define (bind k v al)
    (cond
       ((null? al) set! al '((k v)))
       (else (set-car! al '(k v)))))
现有关联列表
((a1)(b2)(c3))

函数调用:
(绑定D 4 al)

输出:
((a1)(b2)(c3)(d4))

但是我得到了错误:
set!:错误语法:setset时使用code>


我如何使用
set不正确?

您缺少
集合周围的括号呼叫:

(define (bind k v al)
    (cond 
        ((null? al) (set! al '((k v))))
        (else (set-car! al '(k v))))))
顺便说一句,你还有其他问题:

  • set正在设置局部变量,而不是全局变量。函数应返回新值
    al
    。要使用它,您需要执行
    (set!al(bind'D 4 al))
    。还请注意,调用时需要引用
    D
    ,否则它将尝试使用变量
    D
    的值
  • 变量不会在带引号的列表中计算。因此,您将文字符号
    k
    v
    放入关联列表,而不是这些参数的值
  • 设置汽车将替换列表的第一个元素,而不是向列表中添加新元素。您需要使用
    cons
    添加到列表中
  • 正确的代码应为:

    (define (bind k v al)
        (cond 
            ((null? al) (set! al (list (list k v)))
            (else (set! al (cons (list k v) al))))
        al)
    
    但是考虑到一个空列表与创建一个新列表是一样的,因此没有必要进行
    null?
    检查;这两种情况是一样的。只是:

    (define (bind k v al)
        (cons (list k v) al))
    

    绑定函数的版本中是否存在格式错误?在最后一行挂起“al”后,您似乎缺少一个右括号。找到它后,您似乎在第一个条件的末尾缺少一个右括号始终
    cons
    al
    上插入新值?如果已经设置了
    k
    ,该怎么办?@user633183搜索列表会返回第一个匹配项,因此总是考虑有效,而且比搜索要更新的匹配项更省时。它还允许恢复绑定,只需将其弹出即可。@Barmar聪明!我没有考虑过。谢谢你的回复