Common lisp 通用口齿不清:如何显示圆点?
我想使用点(.)作为符号,如Common lisp 通用口齿不清:如何显示圆点?,common-lisp,Common Lisp,我想使用点(.)作为符号,如a或b 我发现我可以通过引用和避开圆点来做到这一点。但是,当点显示在屏幕上时,它被垂直条包围: '\. => |.| 如果没有垂直条,如何显示圆点 更新:感谢jkiiski,使用格式非常有效。这就是为什么我要这么做:为了我自己的教育,我编写了一个函数,将列表表示法中的列表转换为等效的点表示法列表。感谢您的帮助,现在它工作得非常好: (defun list-notation-to-dot-notation (lst) (cond ((atom lst)
a
或b
我发现我可以通过引用和避开圆点来做到这一点。但是,当点显示在屏幕上时,它被垂直条包围:
'\.
=> |.|
如果没有垂直条,如何显示圆点
更新:感谢jkiiski,使用格式
非常有效。这就是为什么我要这么做:为了我自己的教育,我编写了一个函数,将列表表示法中的列表转换为等效的点表示法列表。感谢您的帮助,现在它工作得非常好:
(defun list-notation-to-dot-notation (lst)
(cond ((atom lst) lst)
((null (cdr lst)) (list (list-notation-to-dot-notation (car lst)) '\. 'NIL))
(t (list (list-notation-to-dot-notation (car lst)) '\. (list-notation-to-dot-notation (cdr lst))))))
(defun list-2-dot (lst)
(format t "~a" (list-notation-to-dot-notation lst)))
(list-2-dot '(a))
=> (A . NIL)
(list-2-dot '(a b))
=> (A . (B . NIL))
(list-2-dot '((a) b))
=> ((A . NIL) . (B . NIL))
(list-2-dot '(a (b) c))
=> (A . ((B . NIL) . (C . NIL)))
(list-2-dot '(a b (c)))
=> (A . (B . ((C . NIL) . NIL)))
(list-2-dot '((a) (b) (c)))
=> ((A . NIL) . ((B . NIL) . ((C . NIL) . NIL)))
这将是实现相同结果的一种更干净的方法:
(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)))
无需为点创建额外列表或使用符号。仅供参考,lisp打印机将始终将点(.)符号打印为
.
,因为点与特殊的、lisp读取器定义的规则相关联。除非它是名称的一部分,如foo.bar
,否则读者总是会认为您指的是某种虚线列表。我发现这是解决此问题的最简单方法:
(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中所发现的:符号计算的温和介绍
假设您有一个函数,list notation to dot notation
,您知道它将列表从list notation转换为dot notation,即:
- 打印列表的
(车辆列表)
- 打印一个点
- 并打印列表
(cdr列表)
car
和cdr
上的函数,将它们转换为点符号,并在它们之间加一个点
就我个人而言,我发现基本条件有点棘手。
由于您不能简单地编写
(cond((atom list)
list
)…
,因为它无法正确地打印原子(根本!),可能是因为返回值将传递到格式
,如果不使用条形图打印它将是不明确的(例如,is(1.2)
cons单元格或三个元素的列表)。如果您使用~a
指令以格式打印它,它将没有竖条,但我认为在任何情况下这都不会有用。使用函数PRINC
。哇!很不错的。谢谢你,jkiiski!