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