我有一个反对的列表,例如'((a . 3) (b . 2))。如果cons中的第一个元素与var匹配,我想要删除具有破坏性的一对反式。如果列表中只有一个反对,或者它在列表中第一位,则我的函数无法移除一对参数。
(defun delete-bindings! (var symbol-table)
(cond
((endp symbol-table) '())
((eql var (caar symbol-table))
(delete-bindings! var (cdr symbol-table)))
(t (setf (cdr symbol-table) (delete-bindings! var (cdr symbol-table)))
symbol-table))))我遗漏了什么?
谢谢!
发布于 2011-12-09 18:37:38
我认为,您的函数总是返回'() (不能确定,因为您没有显示全部内容)。
也许:
(defun delete-bindings! (var symbol-table)
(cond
((endp symbol-table) '())
((eql var (caar symbol-table))
(delete-bindings! var (cdr symbol-table)))
(t (progn
(setf (cdr symbol-table) (delete-bindings! var (cdr symbol-table)))
symbol-table)))增编:
您必须使用此函数的结果,而不仅仅取决于其副作用:
(setq *bindings* (delete-bindings! 'var *bindings*))第二增编
Loading ~/ccl-init.lisp
Welcome to Clozure Common Lisp Version 1.7-dev-r14406M-trunk (DarwinX8632)!
? (defun delete-bindings! (var symbol-table)
(cond
((endp symbol-table) '())
((eql var (caar symbol-table))
(delete-bindings! var (cdr symbol-table)))
(t (progn
(setf (cdr symbol-table) (delete-bindings! var (cdr symbol-table)))
symbol-table))))
DELETE-BINDINGS!
? (delete-bindings! 'a '((a . 3) (b . 2)))
((B . 2))
? 如果您需要通过更新对其的所有引用来破坏性地修改数据结构,则需要另一级别的间接操作。
例如,
(defvar *symbol-table* (cons 'bindings '((a . 3) (b . 2))))
(defun delete-bindings! (var symbol-table)
(flet ((db! (var symbol-table) (cond
((endp symbol-table) '())
((eql var (caar symbol-table))
(delete-bindings! var (cdr symbol-table)))
(t (progn
(setf (cdr symbol-table) (delete-bindings! var (cdr symbol-table)))
symbol-table)))))
(rplacd symbol-table (db! var (cdr symbol-table)))))发布于 2011-12-10 00:54:25
函数不能修改它们作为参数获得的变量,它们总是接收变量的值而不是变量本身。相反,您可以使用定义-修改-宏
(define-modify-macro delete-bindings! (item)
(lambda (symbol-table item)
(remove item symbol-table :key #'car)))发布于 2011-12-09 18:48:28
这不是你问题的答案,但除非你是为了自学,否则使用delete会更容易。
类似于(未经测试的):
(defun delete-bindings! (var symbol-table)
(delete var symbol-table :key #'car))https://stackoverflow.com/questions/8449989
复制相似问题