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!