
- 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 | 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。但是,存在以下差異:
|
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
|
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