我想将点(。)用作符号,例如y
或a
。
我发现我可以通过引用和转义点来实现。但是,当点显示在屏幕上时,它被垂直条包围:
b
如何在没有垂直条的情况下显示点?
更新:谢谢jkiiski,使用'\.
=> |.|
效果很好。这就是我这样做的原因:对于我自己的教育,我编写了一个函数,将列表表示法中的列表转换为点表示法中的等效列表。感谢您的帮助,现在效果很好:
format
答案 0 :(得分:5)
这将是一种更简洁的方法来实现相同的结果:
(defun print-dot-notation (list &optional (stream *standard-output*))
(if (atom list)
(format stream "~s" list)
(format stream "(~a . ~a)"
(print-dot-notation (car list) nil)
(print-dot-notation (cdr list) nil))))
(print-dot-notation '(a (b) c))
; (A . ((B . NIL) . (C . NIL)))
无需为点创建额外列表或使用符号。
答案 1 :(得分:0)
我发现这是最简单的案例解决方案:
(defun list-notation-to-dot-notation (list)
(cond ((atom list) (format t "~S" list))
(t (format t "(")
(list-notation-to-dot-notation (car list))
(format t " . ")
(list-notation-to-dot-notation (cdr list))
(format t ")"))))
在David S.Touretzky教授的 Common Lisp:A Gentle Introduction to Symbolic Computation 中找到。
假设你有一个函数list-notation-to-dot-notation
,你知道它将列表从列表符号转换为点符号,即:
car
(car list)
.
cdr
(cdr list)
然后,你所要做的就是在car
和cdr
上递归调用该函数,将它们转换为点符号,然后在它们之间插入一个点。
就个人而言,我发现基本条件有点棘手。
你不能简单地写(cond ((atom list)
list
)) ...
,因为它不会正确打印原子(根本就是!),也许是因为返回值将传递给format
。
答案 2 :(得分:-1)
仅供参考,lisp打印机将始终将点(。)符号打印为|.|
,因为该点与特殊的lisp阅读器定义的规则相关联。除非它是foo.bar
之类的名称的一部分,否则读者总是假设你的意思是某种虚线列表。