Lisp 埃佩里,普林斯;公司vs格式

Lisp 埃佩里,普林斯;公司vs格式,lisp,common-lisp,Lisp,Common Lisp,Common Lisp第9.10章:符号计算声明的温和介绍: 原始i/o函数ERPI、PRIN1、PRINC和PRINT是在Lisp 1.5(所有现代Lisp系统的前身)中定义的,至今仍存在于常见的Lisp中。它们作为历史笔记包含在高级主题部分;您可以使用格式获得相同的效果 这意味着你不再需要普林斯公司,而在现代代码中,你只需要依赖格式 这样做有什么缺点吗?分别地,是否有任何事情是一个人无法通过与其他人一起工作的格式实现的?这些功能与以下格式操作符完全对应: TERPRI=~% FRESH-L

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

原始i/o函数ERPI、PRIN1、PRINC和PRINT是在Lisp 1.5(所有现代Lisp系统的前身)中定义的,至今仍存在于常见的Lisp中。它们作为历史笔记包含在高级主题部分;您可以使用格式获得相同的效果

这意味着你不再需要普林斯公司,而在现代代码中,你只需要依赖格式


这样做有什么缺点吗?分别地,是否有任何事情是一个人无法通过与其他人一起工作的
格式
实现的?

这些功能与以下
格式
操作符完全对应:

  • TERPRI
    =
    ~%
  • FRESH-LINT
    =
    ~&
  • PRIN1
    =
    ~S
  • PRINC
    =
    ~A
  • 打印
    =
    ~%~S

您也可以使用更现代的
编写
。我不太喜欢
格式
,因为它的子语言非常简洁,通常会被解释。请注意,一个好的实现可能能够将格式指令编译成更高效的代码。我主要是在使复杂代码更短时使用格式,但不是输出普通对象或单回车之类的东西

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

不,你不应该依赖于格式,而不是暗示。仅仅因为你可以使用更新的东西并不意味着它总是更好。我不知道这是否值得一个完整的答案,但我发现ERPI在编写漂亮的打印例程方面特别有帮助,我知道我只是想要一个换行符。当我确切地知道我需要什么,而我不需要格式来为我解释它时,我觉得
(format…~%”
太过分了。也与
(format…~&“
)相反。它存在一些类似于“~A~%”的函数?(现代印刷品)@manolevilla我不这么认为
WRITE
是最通用的输出函数,但我认为它的任何选项都不能做到这一点。感谢您的回答。这对我来说是一件有趣的事情,因为在其他语言上有这样的打印功能是如此普遍,以至于我几乎错过了。您确实可以使用
PRINC
+
TEPRI
甚至
FORMAT
来实现该结果,但我没有使用CL stdlib来实现类似
PRINTLN
的函数。但没关系,写一篇不值得讨论的文章很容易。对我来说,这只是一件有趣的事情。我认为,从历史上看,
PRINT
在开头写换行符的原因是,当您键入结束符
时,原始的MACLISP就开始在REPL中执行,而不需要您按Return键。因此,这确保了输出将在下一行。我不知道,很好的信息!这似乎是一个很好的理由。