LISP - 輸入與輸出



Common LISP 提供了許多輸入輸出函式。我們已經使用了 format 函式和 print 函式進行輸出。在本節中,我們將研究 LISP 提供的一些最常用的輸入輸出函式。

輸入函式

下表提供了 LISP 最常用的輸入函式:

序號 函式及描述
1

read & 可選 input-stream eof-error-p eof-value recursive-p

它從 input-stream 讀取 Lisp 物件的打印表示形式,構建相應的 Lisp 物件,並返回該物件。

2

read-preserving-whitespace & 可選 in-stream eof-error-p eof-value recursive-p

它用於某些特殊情況,在這些情況下,需要精確確定哪個字元終止了擴充套件標記。

3

read-line & 可選 input-stream eof-error-p eof-value recursive-p

它讀取以換行符結尾的一行文字。

4

read-char & 可選 input-stream eof-error-p eof-value recursive-p

它從 input-stream 獲取一個字元,並將其作為字元物件返回。

5

unread-char character & 可選 input-stream

它將最近從 input-stream 讀取的字元放回 input-stream 的開頭。

6

peek-char & 可選 peek-type input-stream eof-error-p eof-value recursive-p

它返回將要從 input-stream 讀取的下一個字元,而不會實際將其從輸入流中刪除。

7

listen & 可選 input-stream

謂詞 listen 如果 input-stream 中有字元立即可用,則為真,否則為假。

8

read-char-no-hang & 可選 input-stream eof-error-p eof-value recursive-p

它類似於 read-char,但如果它沒有獲取到字元,它不會等待字元,而是立即返回 nil。

9

clear-input & 可選 input-stream

它清除與 input-stream 關聯的任何緩衝輸入。

10

read-from-string string & 可選 eof-error-p eof-value & 鍵 :start :end :preserve-whitespace

它依次獲取字串的字元並構建一個 LISP 物件,並返回該物件。它還返回字串中第一個未讀取字元的索引,或者字串的長度(或長度+1),具體情況視情況而定。

11

parse-integer string & 鍵 :start :end :radix :junk-allowed

它檢查由 :start 和 :end(預設為字串的開頭和結尾)限定的字串子串。它跳過空格字元,然後嘗試解析一個整數。

12

read-byte binary-input-stream & 可選 eof-error-p eof-value

它從 binary-input-stream 讀取一個位元組,並將其以整數的形式返回。

從鍵盤讀取輸入

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 中的所有輸出函式都帶有一個名為 output-stream 的可選引數,輸出將傳送到該引數。如果未提及或為 nil,則 output-stream 預設為變數 *standard-output* 的值。

下表提供了 LISP 最常用的輸出函式:

序號 函式及描述
1

write object & 鍵 :stream :escape :radix :base :circle :pretty :level :length :case :gensym :array

write object & 鍵 :stream :escape :radix :base :circle :pretty :level :length :case :gensym :array :readably :right-margin :miser-width :lines :pprint-dispatch

兩者都將物件寫入由 :stream 指定的輸出流,該流預設為 *standard-output* 的值。其他值預設為為列印設定的相應全域性變數。

2

prin1 object & 可選 output-stream

print object & 可選 output-stream

pprint object & 可選 output-stream

princ object & 可選 output-stream

所有這些函式都將物件的打印表示形式輸出到 output-stream。但是,存在以下差異:

  • prin1 將物件作為其值返回。

  • print 在物件前面列印一個換行符,並在後面列印一個空格。它返回物件。

  • pprint 與 print 類似,只是省略了尾隨空格。

  • princ 與 prin1 類似,只是輸出沒有跳脫字元

3

write-to-string object & 鍵 :escape :radix :base :circle :pretty :level :length :case :gensym :array

write-to-string object & 鍵 :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 & 可選 output-stream

它將字元輸出到 output-stream,並返回字元。

5

write-string string & 可選 output-stream & 鍵 :start :end

它將 string 指定子字串的字元寫入 output-stream

6

write-line string & 可選 output-stream & 鍵 :start :end

它的工作方式與 write-string 相同,但在之後輸出一個換行符。

7

terpri & 可選 output-stream

它將換行符輸出到 output-stream

8

fresh-line & 可選 output-stream

僅當流不在行的開頭時,它才會輸出一個換行符。

9

finish-output & 可選 output-stream

force-output & 可選 output-stream

clear-output & 可選 output-stream

  • 函式 finish-output 嘗試確保傳送到 output-stream 的所有輸出都已到達其目的地,然後才返回 nil。

  • 函式 force-output 啟動清空任何內部緩衝區,但在等待完成或確認之前返回 nil。

  • 函式 clear-output 嘗試中止正在進行的任何未完成的輸出操作,以允許儘可能少的輸出繼續到達目的地。

10

write-byte integer binary-output-stream

它寫入一個位元組,即 integer 的值。

示例

建立一個名為 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 包含要輸出的字元和列印指令。

格式指令 由波浪號 (~)、可選的字首引數(用逗號分隔)、可選的冒號 (:) 和 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
廣告