常见的LISP提供许多输入输出函数,我们已经使用了格式化函数和打印函数进行输出,在本节中,我们将研究LISP中提供的一些最常用的输入输出函数。
Read函数
下表提供了LISP最常用的输入函数-
Sr.No. | Function & 描述 |
---|---|
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 如果输入流中立即有一个字符,则断言 listen 为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 清除与 input-stream相关的所有缓冲输入。 |
10 |
read-from-string string & optional eof-error-p eof-value & key :start :end :preserve-whitespace 它连续获取字符串的字符,并构建一个LISP对象 并返回该对象 。 |
11 |
parse-integer string & key :start :end :radix :junk-allowed 它检查由:start和:end分隔的字符串子字符串(默认为字符串的开头和结尾)。它跳过空白字符,然后尝试解析整数。 |
12 |
read-byte binary-input-stream & optional eof-error-p eof-value 它从二进制输入流中读取一个字节,并以整数形式返回。 |
键盘读取输入
read 函数用于从键盘获取输入,如,考虑代码片段-
(write ( + 15.0 (read)))
假设用户从STDIN输入中输入10.2,它将返回,
25.2
read函数从输入流中读取字符,并通过解析为Lisp对象的表示来解释它们。
读取输入 - 示例1
创建一个名为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
读取输入 - 示例2
创建一个名为main.lisp的新源代码文件,然后在其中键入以下代码。
(with-input-from-string (stream "Welcome to Learnfk Point!") (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 #\t #\o #\Space
Output函数
LISP中的所有输出函数都使用一个名为 output-stream 的可选参数,输出发送到该参数。如果为nil ,则输出流默认为变量* standard-output *的值。
下表提供了LISP最常用的输出函数-
Sr.No. | Function and 描述 |
---|---|
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指定的输出流,默认为* standard-output *的值。其他值默认为为打印设置的相应全局变量。 |
2 |
prin1 object & optional output-stream print object & optional output-stream pprint object & optional output-stream princ object & optional output-stream 所有这些函数将对象的打印表示输出到 output-stream 。但是,存在以下差异-
|
3 |
write-to-string object & key :escape :radix :base :circle :pretty :level :length :case :gensym :array write-to-string object & key :escape :radix :base :circle :pretty :level :length :case :gensym :array :readably :right-margin :miser-width :lines :pprint-dispatch prin1-to-string Object 从字符串到字符串对象 有效地打印对象 ,并将输出字符制成字符串,然后将其返回。 |
4 |
write-char character & optional output-stream 它将字符输出到 output-stream ,并返回字符。 |
5 |
write-string string & optional output-stream & key :start :end 它将 string 的指定子字符串的字符写入 output-stream。 |
6 |
write-line string & optional output-stream & key :start :end 它的工作方式与写字符串相同,但之后输出换行符。 |
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
下表简要介绍了常用指令-
Sr.No. | Directive & 描述 |
---|---|
1 |
~A 后跟ASCII参数。 |
2 |
~S 其次是S表达式。 |
3 |
~D 对于十进制参数。 |
4 |
~B 对于二进制参数。 |
5 |
~O 对于八进制参数。 |
6 |
~X 对于十六进制参数。 |
7 |
~C 对于字符参数。 |
8 |
~F 对于固定格式的浮点参数。 |
9 |
~E 指数浮点参数。 |
10 |
~$ 美元和浮点参数。 |
11 |
~% 将打印新行。 |
12 |
~* 下一个参数将被忽略。 |
13 |
~? 间接下一个参数必须是字符串,其后的是列表。 |
格式化输出 - 示例
让我们重写计算圆面积的程序,创建一个名为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