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

时间:2018-04-13 01:02:22

标签: 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)))))

我希望代码的工作方式如下:

现有关联列表((A 1) (B 2) (C 3))

函数调用: (bind D 4 al)

输出: ((A 1) (B 2) (C 3) (D 4))

但是我在第一次使用set!: bad syntax in: set!

时收到错误:set!

我如何错误地使用set!

1 个答案:

答案 0 :(得分:1)

您错过了set!电话周围的括号:

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

  1. set!正在设置局部变量,而不是全局变量。您的函数应返回al的新值。要使用它,您需要执行(set! al (bind 'D 4 al))。另请注意,在调用时需要引用D,否则会尝试使用变量D的值。
  2. 变量不在引用列表中评估。因此,您要将文字符号kv放入关联列表,而不是这些参数的值。
  3. set-car!将替换列表的第一个元素,而不是向列表中添加新元素。您需要使用cons添加到列表中。
  4. 正确的代码应该是:

    (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))