Functional programming Scheme-为关联列表编写绑定函数?
我正在尝试在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) (
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!:错误语法:set第一次使用set时使用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聪明!我没有考虑过。谢谢你的回复