LISP - 输入和输出


Common LISP 提供了大量的输入输出函数。我们已经使用了 format 函数和 print 函数来进行输出。在本节中,我们将研究 LISP 中提供的一些最常用的输入输出函数。

输入功能

下表提供了 LISP 最常用的输入函数 -

先生。 功能说明
1

读取和可选输入流 eof-error-p eof-value recursive-p

它从输入流中读取 Lisp 对象的打印表示,构建相应的 Lisp 对象,然后返回该对象。

2

读取保留空白和可选的流内 eof-error-p eof-value recursive-p

它用于一些需要精确确定终止扩展令牌的字符的特殊情况。

3

读取行和可选输入流 eof-error-p eof-value recursive-p

它读入以换行符结尾的一行文本。

4

读取字符和可选输入流 eof-error-p eof-value recursive-p

它从输入流中获取一个字符并将其作为字符对象返回。

5

未读字符 和可选输入流

它将最近从输入流中读取的字符放在输入流的前面。

6

peek-char和可选的peek-type 输入流 eof-error-p eof-value recursive-p

它返回要从输入流读取的下一个字符,而不实际将其从输入流中删除。

7

监听和可选输入流

如果输入流中存在立即可用的字符,则谓词Listen为 true,否则为 false。

8

read-char-no-hang和可选输入流 eof-error-p eof-value recursive-p

它与read-char类似,但如果没有获取到字符,则不会等待字符,而是立即返回 nil。

9

清除输入和可选输入流

它清除与输入流关联的任何缓冲输入。

10

从字符串读取 字符串和可选的eof-error-p eof-value & key :start :end :preserve-whitespace

它连续获取字符串的字符并构建一个 LISP 对象并返回该对象。它还返回未读取的字符串中第一个字符的索引,或字符串的长度(或长度+1),视情况而定。

11

解析整数 字符串和键:开始:结束:基数:允许垃圾

它检查由 :start 和 :end 分隔的字符串的子字符串(默认为字符串的开头和结尾)。它会跳过空白字符,然后尝试解析整数。

12

读取字节 二进制输入流和可选的eof-error-p eof-value

它从二进制输入流中读取一个字节并以整数形式返回。

从键盘读取输入

read函数用于从键盘获取输入这可能不需要任何争论。

例如,考虑代码片段 -

(write ( + 15.0 (read)))

假设用户从 STDIN 输入输入 10.2,它返回,

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 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 

输出函数

LISP 中的所有输出函数都采用一个称为输出流的可选参数,输出将发送到该参数。如果未提及或为零,则输出流默认为变量 *standard-output* 的值。

下表提供了 LISP 最常用的输出函数 -

先生。 功能及说明
1

写入 对象和键 :stream :escape :radix :base :circle :pretty :level :length :case :gensym :array

写入 对象和键 :stream :escape :radix :base :circle :pretty :level :length :case :gensym :array :readically :right-margin :miser-width :lines :pprint-dispatch

两者都将对象写入由 :stream 指定的输出流,默认为 *standard-output* 的值。其他值默认为打印时设置的相应全局变量。

2

prin1 对象和可选输出流

打印 对象和可选的输出流

pprint 对象和可选输出流

princ 对象和可选输出流

所有这些函数将对象的打印表示输出到输出流。然而,存在以下差异 -

  • prin1 返回对象作为其值。

  • print 打印对象时前面带有换行符,后跟一个空格。它返回对象。

  • pprint 与 print 类似,只是省略了尾随空格。

  • princ 与 prin1 类似,只是输出没有转义字符

3

写入字符串 对象和键:escape :radix :base :circle :pretty :level :length :case :gensym :array

写入字符串 对象和键 :escape :radix :base :circle :pretty :level :length :case :gensym :array :readically :right-margin :miser-width :lines :pprint-dispatch

prin1 到字符串 对象

原理转字符串 对象

该对象被有效打印,并将输出字符制成字符串并返回。

4

write-char 字符和可选的输出流

它将字符输出到输出流,并返回字符。

5

write-string 字符串& 可选输出流& key :start :end

它将string的指定子字符串的字符写入输出流。

6

写行字符串 可选的输出流和键:开始:结束

它的工作方式与 write-string 相同,但随后输出换行符。

7

terpri和可选的输出流

它将换行符输出到输出流。

8

新鲜线和可选输出流

仅当流尚未位于行的开头时,它才输出换行符。

9

完成输出和可选输出流

强制输出和可选输出流

清晰输出和可选输出流

  • 函数finish-output尝试确保发送到输出流的所有输出都已到达其目的地,然后才返回 nil。

  • 函数force-output启动所有内部缓冲区的清空,但不等待完成或确认就返回nil。

  • 函数清除输出尝试中止正在进行的任何未完成的输出操作,以便允许尽可能少的输出继续到达目的地。

10

写入字节 整数二进制输出流

它写入一个字节,即整数的值

例子

创建一个名为 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

在哪里,

  • 目标是标准输出
  • 控制字符串保存要输出的字符和打印指令。

格式指令由波形符 (~)、以逗号分隔的可选前缀参数、可选冒号 (:) 和 at 符号 (@) 修饰符以及指示该指令类型的单个字符组成。

前缀参数通常是整数,表示为可选的有符号十进制数。

下表提供了常用指令的简要描述 -

先生。 指令和说明
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