View on GitHub

Yoy-wiw

A website on lisp.

Download this project as a .zip file Download this project as a tar.gz file

咱也学学Lisp(8)–输出

11 Oct 2012

原文见:http://lisp.plasticki.com/

当计算一个Lisp表达式的时候,小弟会给出一个输出(计算结果),但如果一个程序需要多个输出的时候,就需用下面的函数。

CL-USER> (print 123)

123

123

CL-USER> (print "你好")

"你好"

"你好"

CL-USER> (princ "你好")

你好

"你好"

CL-USER> (prin1 "你好")

"你好"

"你好"

为什么每次都输出两个结果,因为第一个是函数的作用,第二个是函数的返回,小弟帮你输出了。看下面:

CL-USER> (+ (print 23) 34)

23

57

23 为 print 函数的作用,57 为 + 函数的计算结果。另外 princ 和 prin1 与 print 类似,只有少许的区别,自行体会。

下面是史上最强输出函数 format :

CL-USER> (format t "The answer of 3 plus 4 is ~D." (+ 3 4))

The answer of 3 plus 4 is 7.

NIL

format 至少有两个参数,第一个参数可以是 T ,NIL,流,或字符串数组(不知道流和字符串数组是什么,以后告诉你);第二个参数是字符串(看上一节);后面还可以跟 0 个或多个参数,每个参数要能够求值,至于多少个,取决于你想干什么和第二个参数。

好像很复杂哦,解释一下:

第一个参数统称目的地,T 是标准输出流,也就是显示器;NIL 是哪里也不输出,将输出作为 format 函数的返回,如果不是 NIL,format 会返回 NIL。

第二个参数很复杂,决定了输出格式,尤其注意~后面的内容,是要被第三个或以后的参数替掉的,如何替,小小的透漏一下:

~D整数替,~$小数替,~F另一个小数替,~A字符串替(万能替),~%变换行,~R翻译成英文,~(~)大小写字母转换,~[~]选择替,~{~}列表替,~*跳过。

太复杂了,看例子吧:

CL-USER> (format nil "~A,~D,~F,~$" "你好" 200 PI (/ PI 2))

"你好,200,3.141592653589793,1.57"

CL-USER> (format nil "~R" 1234)

"one thousand two hundred thirty-four"

CL-USER> (format nil "~[cat~;dog~;bird~]" 1)

"dog"

CL-USER> (format nil "~:(~R~)" 456)

"four hundred fifty-six"

CL-USER> (format nil "~:(~R~)" 456)

"Four Hundred Fifty-Six"

CL-USER> (format nil "~{~D~%~}" (list 45 90))

"4590"

CL-USER> (format t "~{~D~^~%~}" (list 45 90 110 119))

45

90

110

119

NIL

太强大了,我也没有完全搞明白。