terpri,princ&co.vs格式

Gol*_*den 4 lisp common-lisp

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

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

这意味着你没有neet princ&co.在现代代码中,你只需要依赖它format.

这样做有什么不利之处吗?分别是否有任何format与其他东西无法实现的东西?

Rai*_*wig 6

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

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

  • 旧的s表达式打印例程
  • 专用和通用的流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
Run Code Online (Sandbox Code Playgroud)


Bar*_*mar 5

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

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

  • 我认为`PRINT` 在开头写换行符的历史原因是因为当你输入结束`)` 时,原始MACLISP 开始在REPL 中执行,而不需要你按Return。所以这确保了输出会在下一行。 (2认同)