Common Lisp:如何显示一个点?

时间:2016-03-12 15:53:24

标签: common-lisp

我想将点(。)用作符号,例如ya

我发现我可以通过引用和转义点来实现。但是,当点显示在屏幕上时,它被垂直条包围:

b

如何在没有垂直条的情况下显示点?

更新:谢谢jkiiski,使用'\. => |.| 效果很好。这就是我这样做的原因:对于我自己的教育,我编写了一个函数,将列表表示法中的列表转换为点表示法中的等效列表。感谢您的帮助,现在效果很好:

format

3 个答案:

答案 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)

然后,你所要做的就是在carcdr上递归调用该函数,将它们转换为点符号,然后在它们之间插入一个点。

就个人而言,我发现基本条件有点棘手。 你不能简单地写(cond ((atom list) list )) ...,因为它不会正确打印原子(根本就是!),也许是因为返回值将传递给format

答案 2 :(得分:-1)

仅供参考,lisp打印机将始终将点(。)符号打印为|.|,因为该点与特殊的lisp阅读器定义的规则相关联。除非它是foo.bar之类的名称的一部分,否则读者总是假设你的意思是某种虚线列表。