我也尝试替代功能没有结果来代替NIL,也。
没有标准的替代函数可以使用。 substitute
是一个序列处理函数:它不会递归到树结构中。
的sublis
和subst
功能将处理树状结构,但他们对待conses之外的car
和cdr
领域同样:如果我们在整个树形结构:whatever
,适用于所有终端原子的取代nil
,使(a nil b)
变成(a :whatever b . :whatever)
。
我们必须使我们的输出功能,这就好比subst
,但只影响car
-s:
[1]> (subcar nil "()" '(a b c nil (e nil f (g nil)) nil))
(A B C "()" (E "()" F (G "()")) "()")
:
(defun subcar (old new nested-list)
(cond
((eq nested-list old) new)
((atom nested-list) nested-list)
(t (mapcar (lambda (atom-or-sublist)
(subcar old new atom-or-sublist))
nested-list))))
有了这个,我们可以用字符串替换"()"
-s nil
如果我们打印出来,字符串只是作为数据打印而不是机器可读的字符串文字:
[2]> (format t "~a~%" *) ;; * in the REPL refers to result of previous evaluation
(A B C() (E() F (G()))())
我希望你明白,nil
和()
的意思完全一样的东西;它们是相同的对象:
[3]> (eq nil())
T
的唯一途径符号令牌nil
可以表示比()
其他的目的是,如果我们我们是其中未导入来自common-lisp
包nil
符号(一个包和nil
被拘留作为该包中的一个局部符号,完全无关cl:nil
):
[1]> (defpackage "FOO" (:use))
#<PACKAGE FOO>
[2]> (in-package "FOO")
#<PACKAGE FOO>
理智测试:从包内foo
检查cl:nil
是第与()
对象相同。我们必须参考eq
功能cl:eq
,因为包foo
没有从cl
输入任何东西:
FOO[3]> (cl:eq cl:nil())
COMMON-LISP:T
现在让我们来看看在nil
这个包是()
:
FOO[4]> (cl:eq nil())
*** - SYSTEM::READ-EVAL-PRINT: variable NIL has no value
OOPS!这不是标准nil
了;它没有特殊的行为,它评估自己。我们必须引用它:
FOO[6]> (cl:eq 'nil())
COMMON-LISP:NIL
不,不是()
对象。请注意0函数的返回值如何打印为COMMON-LISP:NIL
或COMMON-LISP:T
。只有当它们出现在当前包中时,符号才会打印出没有包前缀的符号。
来源
2016-11-09 01:07:35
Kaz
请问为什么你需要这样做? – coredump