JSRUN 用代码说话

输入与输出

编辑教程

输入与输出

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
所有这些函数对象的打印形式输出到输出流。但是,下面的不同之处有:
prin1 返回对象作为其值。
print 打印与前一个换行符的目标和后跟一个空格。它返回的对象。
pprint 就像印刷不同之处在于省略了结尾间隔。
princ 就像prin1除了输出没有转义字符。
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
函数finish-output尝试确保发送到输出流的所有输出已达到其目标,然后才返回nil。
函数force-output发起的任何内部缓冲区清空,但返回nil,而无需等待完成或确认。
* 函数clear-output 尝试中止,以便使尽可能少的输出继续到目标中的任何出色的输出操作。
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一个新的源代码文件,并在其中输入如下代码:

(adsbygoogle = window.adsbygoogle || \[\]).push({});

(adsbygoogle = window.adsbygoogle || \[\]).push({});

(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
JSRUN闪电教程系统是国内最先开创的教程维护系统, 所有工程师都可以参与共同维护的闪电教程,让知识的积累变得统一完整、自成体系。 大家可以一起参与进共编,让零散的知识点帮助更多的人。
X
支付宝
9.99
无法付款,请点击这里
金额: 0
备注:
转账时请填写正确的金额和备注信息,到账由人工处理,可能需要较长时间
如有疑问请联系QQ:565830900
正在生成二维码, 此过程可能需要15秒钟