- LISP 教程
- LISP - 主页
- LISP - 概述
- LISP - 环境
- LISP - 程序结构
- LISP - 基本语法
- LISP - 数据类型
- LISP - 宏
- LISP - 变量
- LISP - 常量
- LISP - 运算符
- LISP - 决策
- LISP - 循环
- LISP - 函数
- LISP - 谓词
- LISP - 数字
- LISP - 字符
- LISP - 数组
- LISP - 字符串
- LISP - 序列
- LISP - 列表
- LISP - 符号
- LISP - 向量
- LISP - 设置
- LISP - 树
- LISP - 哈希表
- LISP - 输入和输出
- LISP - 文件 I/O
- LISP - 结构
- LISP - 包
- LISP - 错误处理
- LISP-CLOS
- LISP 有用资源
- Lisp - 快速指南
- Lisp - 有用的资源
- Lisp - 讨论
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 对象和可选输出流 所有这些函数将对象的打印表示输出到输出流。然而,存在以下差异 -
|
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 | 完成输出和可选输出流 强制输出和可选输出流 清晰输出和可选输出流
|
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