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 อ็อบเจ็กต์และเอาต์พุตสตรีมที่เป็นทางเลือก

ฟังก์ชั่นทั้งหมดเหล่านี้ออกผลลัพธ์เป็นตัวแทนพิมพ์ของวัตถุที่จะเอาท์พุทสตรีม อย่างไรก็ตามมีความแตกต่างดังต่อไปนี้ -

  • prin1 ส่งคืนวัตถุเป็นค่าของมัน

  • พิมพ์จะพิมพ์วัตถุโดยขึ้นบรรทัดใหม่ก่อนหน้าและตามด้วยช่องว่าง ส่งคืนวัตถุ

  • pprint ก็เหมือนกับการพิมพ์ยกเว้นว่าเว้นช่องว่างต่อท้าย

  • Princ เหมือนกับ prin1 ยกเว้นว่าเอาต์พุตไม่มีอักขระ Escape

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และเอาต์พุตสตรีมเสริม

  • ฟังก์ชั่น 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