gpt4 book ai didi

Lisp - 为空列表打印出 () 而不是 nil

转载 作者:太空宇宙 更新时间:2023-11-03 18:39:49 25 4
gpt4 key购买 nike

我有一个 Lisp 程序,它遍历嵌套列表并删除与传递给函数的元素相匹配的元素。我的问题是,如果嵌套列表之一中的所有内容都被删除,我需要打印出 () 而不是 NIL。

(defun del (x l &optional l0)
(cond ((null l) (reverse l0))
((if (atom x) (eq x (car l)) (remove (car l) x)) (del x (cdr l) l0))
(T (del x (cdr l) (cons (if (not (atom (car l)))
(del x (car l))
(car l))
l0)))))

(defun _delete(a l)
(format t "~a~%" (del a l)))

(_delete 'nest '(nest (second nest level) (third (nest) level)))

返回

((SECOND LEVEL (THIRD NIL LEVEL))

我需要

((SECOND LEVEL (THIRD () LEVEL))

我试过使用 ~:S 格式,但这显然不适用于复合结构。我也试过替代函数来替换 NIL,也没有结果。

最佳答案

两种可能的解决方案:

我。您可以使用格式指令 ~:A~:S

(format t "~:a" '()) => ()

但是,该指令仅适用于列表的顶级元素,即

(format t "~:a" '(a b () c))

不会打印(A B () C)

但是 (A B NIL C)

因此,您需要循环遍历列表,如果它是缺点,则递归地将 ~:A 应用于每个元素。

(defun print-parentheses (l)
(cond ((consp l) (format t "(")
(do ((x l (cdr x)))
((null x) (format t ")" ))
(print-parentheses (car x))
(when (cdr x) (format t " "))))
(t (format t "~:a" l)) ))


(print-parentheses '(a b (c () d))) => (A B (C () D))

二。为空列表创建打印调度函数并将其添加到 pretty-print 调度表中:

(defun print-null (stream obj)
(format stream "()") )

(set-pprint-dispatch 'null #'print-null)

(print '(a () b)) => (A () B)

后者更简单,但它会影响所有环境,这可能不是您想要的。

关于Lisp - 为空列表打印出 () 而不是 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40457915/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com