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
所有這些函數對象的打印形式輸出到輸出流。但是,下面的不同之處有:
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一個新的源代碼文件,並在其中輸入如下代碼:
(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