LISP - แพ็คเกจ
โดยทั่วไปคำศัพท์ของภาษาโปรแกรมแพคเกจได้รับการออกแบบมาเพื่อจัดเตรียมวิธีการแยกชื่อชุดหนึ่งจากอีกชุดหนึ่ง สัญลักษณ์ที่ประกาศในแพ็คเกจหนึ่งจะไม่ขัดแย้งกับสัญลักษณ์เดียวกันกับที่ประกาศในอีกแพ็กเกจ วิธีนี้แพ็กเกจจะช่วยลดความขัดแย้งในการตั้งชื่อระหว่างโมดูลโค้ดอิสระ
เครื่องอ่าน LISP จะเก็บรักษาตารางของสัญลักษณ์ทั้งหมดที่พบ เมื่อพบลำดับอักขระใหม่จะสร้างสัญลักษณ์ใหม่และเก็บไว้ในตารางสัญลักษณ์ ตารางนี้เรียกว่าแพ็คเกจ
แพ็กเกจปัจจุบันถูกอ้างอิงโดยตัวแปรพิเศษแพ็คเกจ *
มีสองแพ็คเกจที่กำหนดไว้ล่วงหน้าใน LISP -
common-lisp - มีสัญลักษณ์สำหรับฟังก์ชันและตัวแปรทั้งหมดที่กำหนดไว้
common-lisp-user- ใช้แพ็คเกจ common-lisp และแพ็คเกจอื่น ๆ ทั้งหมดพร้อมเครื่องมือแก้ไขและดีบัก เรียกสั้น ๆ ว่า cl-user
ฟังก์ชั่นแพ็คเกจใน LISP
ตารางต่อไปนี้แสดงฟังก์ชันที่ใช้บ่อยที่สุดที่ใช้ในการสร้างใช้และจัดการแพ็คเกจ -
ซีเนียร์ | ฟังก์ชันและคำอธิบาย |
---|---|
1 | make-package ชื่อแพ็กเกจและคีย์: ชื่อเล่น: ใช้ สร้างและส่งคืนแพ็กเกจใหม่พร้อมชื่อแพ็กเกจที่ระบุ |
2 | in-package ชื่อแพ็กเกจและคีย์: ชื่อเล่น: ใช้ ทำให้แพ็กเกจเป็นปัจจุบัน |
3 | in-package ชื่อ แมโครนี้ทำให้ * package * ถูกตั้งค่าเป็นชื่อแพ็กเกจซึ่งต้องเป็นสัญลักษณ์หรือสตริง |
4 | find-package ชื่อ มันค้นหาแพ็คเกจ พัสดุที่มีชื่อหรือชื่อเล่นนั้นจะถูกส่งคืน หากไม่มีแพ็กเกจดังกล่าวค้นหาแพ็กเกจจะคืนค่าศูนย์ |
5 | rename-package บรรจุชื่อใหม่และชื่อเล่นใหม่ที่เป็นทางเลือก มันเปลี่ยนชื่อแพ็คเกจ |
6 | list-all-packages ฟังก์ชันนี้ส่งคืนรายการแพ็คเกจทั้งหมดที่มีอยู่ในระบบ Lisp |
7 | delete-package แพ็คเกจ มันลบแพ็คเกจ |
การสร้างแพ็คเกจ LISP
defpackageฟังก์ชันใช้สำหรับสร้างแพ็คเกจที่ผู้ใช้กำหนด มีไวยากรณ์ต่อไปนี้ -
(defpackage :package-name
(:use :common-lisp ...)
(:export :symbol1 :symbol2 ...)
)
ที่ไหน
package-name คือชื่อของแพ็คเกจ
คีย์เวิร์ด: use ระบุแพ็กเกจที่แพ็กเกจนี้ต้องการเช่นแพ็กเกจที่กำหนดฟังก์ชันที่โค้ดใช้ในแพ็กเกจนี้
คีย์เวิร์ด: export ระบุสัญลักษณ์ที่อยู่ภายนอกในแพ็กเกจนี้
make-packageฟังก์ชันนี้ยังใช้สำหรับการสร้างแพ็คเกจ ไวยากรณ์สำหรับฟังก์ชันนี้คือ -
make-package package-name &key :nicknames :use
อาร์กิวเมนต์และคีย์เวิร์ดมีความหมายเหมือนเดิม
การใช้แพ็คเกจ
เมื่อคุณสร้างแพ็กเกจแล้วคุณสามารถใช้โค้ดในแพ็กเกจนี้ได้โดยทำให้เป็นแพ็กเกจปัจจุบัน in-package แมโครทำให้แพ็กเกจเป็นปัจจุบันในสภาพแวดล้อม
ตัวอย่าง
สร้างไฟล์ซอร์สโค้ดใหม่ชื่อ main.lisp และพิมพ์รหัสต่อไปนี้
(make-package :tom)
(make-package :dick)
(make-package :harry)
(in-package tom)
(defun hello ()
(write-line "Hello! This is Tom's Tutorials Point")
)
(hello)
(in-package dick)
(defun hello ()
(write-line "Hello! This is Dick's Tutorials Point")
)
(hello)
(in-package harry)
(defun hello ()
(write-line "Hello! This is Harry's Tutorials Point")
)
(hello)
(in-package tom)
(hello)
(in-package dick)
(hello)
(in-package harry)
(hello)
เมื่อคุณรันโค้ดจะส่งคืนผลลัพธ์ต่อไปนี้ -
Hello! This is Tom's Tutorials Point
Hello! This is Dick's Tutorials Point
Hello! This is Harry's Tutorials Point
การลบแพ็คเกจ
delete-packageมาโครช่วยให้คุณสามารถลบแพ็คเกจได้ ตัวอย่างต่อไปนี้แสดงให้เห็นถึงสิ่งนี้ -
ตัวอย่าง
สร้างไฟล์ซอร์สโค้ดใหม่ชื่อ main.lisp และพิมพ์รหัสต่อไปนี้
(make-package :tom)
(make-package :dick)
(make-package :harry)
(in-package tom)
(defun hello ()
(write-line "Hello! This is Tom's Tutorials Point")
)
(in-package dick)
(defun hello ()
(write-line "Hello! This is Dick's Tutorials Point")
)
(in-package harry)
(defun hello ()
(write-line "Hello! This is Harry's Tutorials Point")
)
(in-package tom)
(hello)
(in-package dick)
(hello)
(in-package harry)
(hello)
(delete-package tom)
(in-package tom)
(hello)
เมื่อคุณรันโค้ดจะส่งคืนผลลัพธ์ต่อไปนี้ -
Hello! This is Tom's Tutorials Point
Hello! This is Dick's Tutorials Point
Hello! This is Harry's Tutorials Point
*** - EVAL: variable TOM has no value