terpri,princ&合。 vs格式

时间:2015-04-19 15:04:00

标签: lisp common-lisp

Common Lisp的第9.10章:对符号计算的温和介绍声明:

  

原始i / o函数TERPRI,PRIN1,PRINC和PRINT是在Lisp 1.5(所有现代Lisp系统的祖先)中定义的,现在仍然可以在Common Lisp中找到。它们作为历史记录包含在“高级主题”部分中;你可以用FORMAT获得同样的效果。

这意味着你没有princ&合。此外,在现代代码中,您只需要依赖format

这样做有什么不利之处吗?分别是format与其他人合作无法实现的任何事情吗?

2 个答案:

答案 0 :(得分:5)

您还可以使用更现代的write。我不是format的忠实粉丝,因为它简洁的子语言通常被解释。请注意,良好的实现可能能够将格式指令编译为更高效的代码。我使用FORMAT主要是因为它使复杂的代码更短,但不能输出普通的对象或像单回车那样......

Common Lisp包含三代或更多代文本I / O API:

  • 旧的s-expression打印例程
  • 专用和通用流IO功能
  • 复杂格式化程序,基于早期的Fortran和/或Multics IO格式化程序
  • 打印对象的通用函数
  • 漂亮的打印机

此外,还有基于CLOS的半标准IO实现,如Gray Streams。

每个人都有其目的,很快就会消失......

CL-USER 54 > (let ((label "Social security number")
                   (colon ": ")
                   (social-security-number '|7537 DD 459234957324 DE|))

               (terpri)
               (princ label)
               (princ colon)
               (princ social-security-number)

               (write-char #\newline)
               (write-string label)
               (write-string colon)
               (write social-security-number :escape nil)

               (format t "~%~A~A~A" label colon social-security-number)

               )

Social security number: 7537 DD 459234957324 DE
Social security number: 7537 DD 459234957324 DE
Social security number: 7537 DD 459234957324 DE

答案 1 :(得分:4)

这些函数完全对应于以下FORMAT运算符:

  • TERPRI = ~%
  • FRESH-LINT = ~&
  • PRIN1 = ~S
  • PRINC = ~A
  • PRINT = ~%~S<space>