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 所有這些函式物件的列印形式輸出到輸出流。但是,下面的不同之處有:
|
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
|
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