首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >公共Lisp,从列表破坏性元素中删除元素

公共Lisp,从列表破坏性元素中删除元素
EN

Stack Overflow用户
提问于 2011-12-09 18:24:56
回答 3查看 4.4K关注 0票数 1

我有一个反对的列表,例如'((a . 3) (b . 2))。如果cons中的第一个元素与var匹配,我想要删除具有破坏性的一对反式。如果列表中只有一个反对,或者它在列表中第一位,则我的函数无法移除一对参数。

代码语言:javascript
复制
(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))))

我遗漏了什么?

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-09 18:37:38

我认为,您的函数总是返回'() (不能确定,因为您没有显示全部内容)。

也许:

代码语言:javascript
复制
(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)))

增编:

您必须使用此函数的结果,而不仅仅取决于其副作用:

代码语言:javascript
复制
(setq *bindings* (delete-bindings! 'var *bindings*))

第二增编

代码语言:javascript
复制
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))
? 

如果您需要通过更新对其的所有引用来破坏性地修改数据结构,则需要另一级别的间接操作。

例如,

代码语言:javascript
复制
(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)))))
票数 2
EN

Stack Overflow用户

发布于 2011-12-10 00:54:25

函数不能修改它们作为参数获得的变量,它们总是接收变量的值而不是变量本身。相反,您可以使用定义-修改-宏

代码语言:javascript
复制
(define-modify-macro delete-bindings! (item)
  (lambda (symbol-table item)
    (remove item symbol-table :key #'car)))
票数 1
EN

Stack Overflow用户

发布于 2011-12-09 18:48:28

这不是你问题的答案,但除非你是为了自学,否则使用delete会更容易。

类似于(未经测试的):

代码语言:javascript
复制
(defun delete-bindings! (var symbol-table)
    (delete var symbol-table :key #'car))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8449989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档