LISP - อินพุตและเอาต์พุต
LISP ทั่วไปมีฟังก์ชันอินพุตเอาต์พุตมากมาย เราได้ใช้ฟังก์ชันฟอร์แมตและฟังก์ชันการพิมพ์สำหรับเอาต์พุตแล้ว ในส่วนนี้เราจะพิจารณาฟังก์ชั่นอินพุต - เอาท์พุตที่ใช้บ่อยที่สุดที่มีให้ใน LISP
ฟังก์ชั่นการป้อนข้อมูล
ตารางต่อไปนี้แสดงฟังก์ชันอินพุตที่ใช้บ่อยที่สุดของ LISP -
ซีเนียร์ | ฟังก์ชั่นและคำอธิบาย |
---|---|
1 | read& ตัวเลือกอินพุตสตรีม eof-error-p eof-value recursive-p อ่านในการแสดงภาพพิมพ์ของวัตถุ Lisp จากอินพุตสตรีมสร้างวัตถุ Lisp ที่สอดคล้องกันและส่งคืนวัตถุ |
2 | read-preserving-whitespace& ตัวเลือกในสตรีม eof-error-p eof-value recursive-p ใช้ในสถานการณ์พิเศษบางอย่างซึ่งเป็นที่พึงปรารถนาในการพิจารณาว่าอักขระใดที่ยุติโทเค็นแบบขยาย |
3 | read-line& ตัวเลือกอินพุตสตรีม eof-error-p eof-value recursive-p มันอ่านในบรรทัดข้อความที่สิ้นสุดโดยขึ้นบรรทัดใหม่ |
4 | read-char& ตัวเลือกอินพุตสตรีม eof-error-p eof-value recursive-p ใช้หนึ่งอักขระจากอินพุตสตรีมและส่งคืนเป็นอ็อบเจ็กต์อักขระ |
5 | unread-char อักขระและอินพุตสตรีมเสริม ทำให้อักขระที่อ่านล่าสุดจากอินพุตสตรีมไปที่ด้านหน้าของอินพุตสตรีม |
6 | peek-char& ตัวเลือกpeek-type input-stream eof-error-p eof-value recursive-p ส่งคืนอักขระถัดไปที่จะอ่านจากอินพุตสตรีมโดยไม่ต้องลบออกจากอินพุตสตรีม |
7 | listen& อินพุตสตรีมที่เป็นทางเลือก เพรดิเคต listen เป็นจริงหากมีอักขระที่พร้อมใช้งานทันทีจากอินพุตสตรีมและเป็นเท็จหากไม่มี |
8 | read-char-no-hang& ตัวเลือกอินพุตสตรีม eof-error-p eof-value recursive-p มันคล้ายกับ read-charแต่ถ้าไม่ได้รับอักขระก็จะไม่รออักขระ แต่จะคืนค่าศูนย์ทันที |
9 | clear-input& อินพุตสตรีมที่เป็นทางเลือก จะล้างอินพุตบัฟเฟอร์ที่เกี่ยวข้องกับอินพุตสตรีม |
10 | read-from-string สตริงและตัวเลือกeof-error-p eof-value & key: start: end: reserve-whitespace ใช้อักขระของสตริงอย่างต่อเนื่องและสร้างวัตถุ LISP และส่งคืนวัตถุ นอกจากนี้ยังส่งกลับดัชนีของอักขระตัวแรกในสตริงที่ไม่ได้อ่านหรือความยาวของสตริง (หรือความยาว +1) แล้วแต่กรณี |
11 | parse-integer string & key: start: end: radix: junk-allowed ตรวจสอบสตริงย่อยของสตริงที่คั่นด้วย: start และ: end (ค่าเริ่มต้นคือจุดเริ่มต้นและจุดสิ้นสุดของสตริง) มันจะข้ามอักขระเว้นวรรคแล้วพยายามแยกวิเคราะห์จำนวนเต็ม |
12 | read-byte ไบนารีอินพุตสตรีมและeof-error-p eof-value ที่เป็นทางเลือก มันอ่านหนึ่งไบต์จากไบนารีอินพุตสตรีมและส่งกลับในรูปแบบของจำนวนเต็ม |
การอ่านข้อมูลจากแป้นพิมพ์
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 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 ใช้อาร์กิวเมนต์ทางเลือกที่เรียกว่าเอาต์พุตสตรีมซึ่งเอาต์พุตจะถูกส่ง หากไม่ได้กล่าวถึงหรือไม่มีค่าเริ่มต้นของเอาต์พุตสตรีมจะเป็นค่าของตัวแปร * standard-output *
ตารางต่อไปนี้แสดงฟังก์ชันเอาต์พุตที่ใช้บ่อยที่สุดของ LISP -
ซีเนียร์ | ฟังก์ชันและคำอธิบาย |
---|---|
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 ซึ่งมีค่าดีฟอลต์เป็นค่า * standard-output * ค่าอื่น ๆ เป็นค่าเริ่มต้นของตัวแปรส่วนกลางที่กำหนดไว้สำหรับการพิมพ์ |
2 | prin1 อ็อบเจ็กต์และเอาต์พุตสตรีมที่เป็นทางเลือก print อ็อบเจ็กต์และเอาต์พุตสตรีมที่เป็นทางเลือก pprint อ็อบเจ็กต์และเอาต์พุตสตรีมที่เป็นทางเลือก princ อ็อบเจ็กต์และเอาต์พุตสตรีมที่เป็นทางเลือก ฟังก์ชั่นทั้งหมดเหล่านี้ออกผลลัพธ์เป็นตัวแทนพิมพ์ของวัตถุที่จะเอาท์พุทสตรีม อย่างไรก็ตามมีความแตกต่างดังต่อไปนี้ -
|
3 | write-to-string object & key : escape: radix: base: circle: pretty: level: length: case: gensym: array write-to-string object & key: escape: radix: base: circle: pretty: level: length: case: gensym: array: readably: right-margin: miser-width: lines: pprint-dispatch prin1-to-string วัตถุ princ-to-string วัตถุ อ็อบเจ็กต์ถูกพิมพ์อย่างมีประสิทธิภาพและอักขระเอาต์พุตจะถูกสร้างเป็นสตริงซึ่งจะส่งคืน |
4 | write-char อักขระและเอาต์พุตสตรีมที่เป็นทางเลือก ส่งออกอักขระไปยังเอาต์พุตสตรีมและส่งกลับอักขระ |
5 | write-string สตริงและเอาต์พุตสตรีมและคีย์เสริม: start: end มันเขียนตัวอักษรของสตริงย่อยที่ระบุของสตริงกับเอาท์พุทสตรีม |
6 | write-line สตริงและเอาต์พุตสตรีมและคีย์เสริม: start: end มันทำงานในลักษณะเดียวกับการเขียนสตริง แต่จะแสดงผลลัพธ์ขึ้นบรรทัดใหม่ในภายหลัง |
7 | terpriและเอาต์พุตสตรีมเสริม ส่งออกบรรทัดใหม่ไปยังเอาต์พุตสตรีม |
8 | fresh-lineและเอาต์พุตสตรีมเสริม จะแสดงขึ้นบรรทัดใหม่เฉพาะในกรณีที่สตรีมไม่ได้อยู่ที่จุดเริ่มต้นของบรรทัด |
9 | finish-outputและเอาต์พุตสตรีมเสริม force-outputและเอาต์พุตสตรีมเสริม clear-outputและเอาต์พุตสตรีมเสริม
|
10 | write-byte จำนวนเต็มไบนารีเอาต์พุตสตรีม มันเขียนหนึ่งไบต์ค่าของจำนวนเต็ม |
ตัวอย่าง
สร้างไฟล์ซอร์สโค้ดใหม่ชื่อ 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
ที่ไหน
- ปลายทางคือเอาต์พุตมาตรฐาน
- สตริงควบคุมเก็บอักขระที่จะส่งออกและคำสั่งการพิมพ์
ก format directive ประกอบด้วยเครื่องหมายทิลเดอ (~), พารามิเตอร์นำหน้าซึ่งเป็นทางเลือกที่คั่นด้วยเครื่องหมายจุลภาค, โมดิฟายเออร์โคลอน (:) และ at-sign (@) และอักขระเดี่ยวที่ระบุประเภทของคำสั่ง
โดยทั่วไปพารามิเตอร์คำนำหน้าจะเป็นจำนวนเต็มโดยระบุเป็นตัวเลขทศนิยม
ตารางต่อไปนี้ให้คำอธิบายสั้น ๆ เกี่ยวกับคำสั่งที่ใช้กันทั่วไป -
ซีเนียร์ | คำสั่งและคำอธิบาย |
---|---|
1 | ~A ตามด้วยอาร์กิวเมนต์ ASCII |
2 | ~S ตามด้วย S-expression |
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