我正在尝试在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!
?
答案 0 :(得分:1)
您错过了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
放入关联列表,而不是这些参数的值。 set-car!
将替换列表的第一个元素,而不是向列表中添加新元素。您需要使用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))