LISP - 输入和输出
Common Lisp提供了大量的输入输出功能。我们已经使用的格式功能,打印输出功能。在本节中,我们将探讨一些在LISP提供了最常用的输入输出功能。
输入函数
下表提供了LISP的最常用的输入功能:
SL No. | 函数和说明 |
---|---|
1 |
read &optional input-stream eof-error-p eof-value recursive-p
它读取一个Lisp对象从输入流的打印形式,建立相应的Lisp对象,并返回该对象。 |
2 |
read-preserving-whitespace &optional in-stream eof-error-p eof-value recursive-p
这是用在一些特殊情况下,最好是确定扩展令牌正好是字符结束。 |
3 |
read-line &optional input-stream eof-error-p eof-value recursive-p
它读取一个文本行由换行符终止。 |
4 |
read-char &optional input-stream eof-error-p eof-value recursive-p
这需要一个字符从输入流并将其作为一个字符的对象。 |
5 |
unread-char character &optional input-stream
它把最近从输入流中读取的字符,到输入数据流的前部。 |
6 |
peek-char &optional peek-type input-stream eof-error-p eof-value recursive-p
它返回的下一个字符被从输入流中读取,而无需实际从输入流中除去它。 |
7 |
listen &optional input-stream
谓词监听为true如果有立即从输入流中的字符,如果不是则为false。 |
8 |
read-char-no-hang &optional input-stream eof-error-p eof-value recursive-p
它类似于read-char字符,但是如果它没有得到一个字符,它不会等待一个字符,但立即返回为nil。 |
9 |
clear-input &optional input-stream
它清除与输入流关联的所有缓冲的输入。 |
10 |
read-from-string string &optional eof-error-p eof-value &key :start :end :preserve-whitespace
它采用字符串的字符,并相继建立一个LISP的对象,并返回该对象。它也返回第一个字符的索引无法读取字符串或字符串(或长度+1)的长度,视具体情况而定。 |
11 |
parse-integer string &key :start :end :radix :junk-allowed
它会检查字符串的子串被分隔:start 和:end(默认为字符串的开头和结尾)。它会跳过空白字符,然后尝试解析一个整数。 |
12 |
read-byte binary-input-stream &optional eof-error-p eof-value
它读取1字节的二进制输入流并将其返回一个整数的形式。 |
读取键盘的输入
read 函数用于从键盘输入。也可以不带任何参数。
例如,考虑代码片段:
(write ( + 15.0 (read)))
假设用户输入10.2 来自stdin 输入,它返回,
25.2
read 函数从输入流中读取字符,并通过解析为Lisp对象的表示解释它们。
示例
创建一个名为main.lisp一个新的源代码文件,并在其中输入如下代码:
; the function AreaOfCircle ; calculates area of a circle ; when the radius is input from keyboard (defun AreaOfCircle() (terpri) (princ "Enter Radius: ") (setq radius (read)) (setq area (* 3.1416 radius radius)) (princ "Area: ") (write area)) (AreaOfCircle)
当执行代码,它返回以下结果:
Enter Radius: 5 (STDIN Input) Area: 78.53999
示例
创建一个名为main.lisp一个新的源代码文件,并在其中输入如下代码:
(with-input-from-string (stream "Welcome to Tutorials Yiibai!") (print (read-char stream)) (print (read-char stream)) (print (read-char stream)) (print (read-char stream)) (print (read-char stream)) (print (read-char stream)) (print (read-char stream)) (print (read-char stream)) (print (read-char stream)) (print (read-char stream)) (print (peek-char nil stream nil 'the-end)) (values))
当执行代码,它返回以下结果:
#W #e #l #c #o #m #e #Space # #o #Space
输出功能
在LISP所有的输出函数都有一个称为输出流可选参数,其输出传送。如果没有提及或nil,输出流默认为变量*标准输出*的值。
下表提供了LISP的最常用的输出函数:
SL No. | 函数和说明 |
---|---|
1 |
write object &key :stream :escape :radix :base :circle :pretty :level :length :case :gensym :array write object &key :stream :escape :radix :base :circle :pretty :level :length :case :gensym :array :readably :right-margin :miser-width :lines :pprint-dispatch 既写对象通过指定的输出流:stream,默认为标准输出*值*。其他值默认为打印设置相应的全局变量。 |
2 |
prin1object &optional output-stream print object &optional output-stream pprint object &optional output-stream princ object &optional output-stream 所有这些函数对象的打印形式输出到输出流。但是,下面的不同之处有:
|
3 |
write-to-string object &key :escape :radix :base :circle :pretty :level :length :case :gensym :array write-to-stringobject &key :escape :radix :base :circle :pretty :level :length :case :gensym :array :readably :right-margin :miser-width :lines :pprint-dispatch prin1-to-string object princ-to-string object 该对象被有效地打印和输出的字符被转成一个字符串,并将该字符串返回。 |
4 |
write-char character &optional output-stream 它输出的字符输出流,并返回字符。 |
5 |
write-string string &optional output-stream &key :start :end 它写入字符串的指定子字符串的字符输出流。 |
6 |
write-line string &optional output-stream &key :start :end 它的工作原理与write-string的方式相同,但是之后输出一个换行符。 |
7 |
terpri &optional output-stream 它输出一个换行符到output-stream。 |
8 |
fresh-line &optional output-stream 它只输出一个换行,如果流不是已经在一行的开始。 |
9 |
finish-output &optional output-stream force-output &optional output-stream clear-output &optional output-stream
|
10 |
write-byte integer binary-output-stream 它写入一个字节,整数的值。 |
示例
创建一个名为main.lisp一个新的源代码文件,并在其中输入如下代码:
; this program inputs a numbers and doubles it (defun DoubleNumber() (terpri) (princ "Enter Number : ") (setq n1 (read)) (setq doubled (* 2.0 n1)) (princ "The Number: ") (write n1) (terpri) (princ "The Number Doubled: ") (write doubled) ) (DoubleNumber)
当执行代码,它返回以下结果:
Enter Number : 3456.78 (STDIN Input) The Number: 3456.78 The Number Doubled: 6913.56
格式化输出
format函数是用于生产很好的格式化文本。它的语法如下:
format destination control-string &rest arguments
那么,
-
destination 是一个标准输出
-
control-string 持有的字符要被输出和打印指令。
format directive 由符号(〜)的,用逗号,可选的冒号(:)和符号(@)修饰符和一个字符指明了哪些指令是分开的可选前缀参数。
前缀参数一般都是整数,记载为可选符号十进制数。
下表提供了常用的指令的简要说明:
指令 | 描述 |
---|---|
~A | 后跟ASCII码参数 |
~S | 后跟S-表达式 |
~D | 为十进制参数 |
~B | 用于二进制参数 |
~O | 用于八进制参数 |
~X | 用于十六进制参数 |
~C | 用于字符参数 |
~F | 用于固定格式的浮点参数。 |
~E | 指数浮点参数 |
~$ | 美元和浮点参数。 |
~% | 被打印新的一行 |
~* | 被忽略的下一个参数 |
~? | 间接。下一个参数必须是一个字符串,一个接一个列表。 |
示例
让我们重写程序计算圆的面积:
创建一个名为main.lisp一个新的源代码文件,并在其中输入如下代码:
(defun AreaOfCircle() (terpri) (princ "Enter Radius: ") (setq radius (read)) (setq area (* 3.1416 radius radius)) (format t "Radius: = ~F~% Area = ~F" radius area) ) (AreaOfCircle)
当执行代码,它返回以下结果:
Enter Radius: 10.234 (STDIN Input) Radius: = 10.234 Area = 329.03473