LISP - 包

  • 简述

    在编程语言的通用术语中,包旨在提供一种将一组名称与另一组名称分开的方法。一个包中声明的符号不会与另一个包中声明的相同符号冲突。这种方式包减少了独立代码模块之间的命名冲突。
    LISP 阅读器维护着它找到的所有符号的表格。当它找到一个新的字符序列时,它会创建一个新的符号并存储在符号表中。该表称为包。
    当前包由特殊变量 *package* 引用。
    LISP 中有两个预定义的包 -
    • common-lisp− 它包含所有定义的函数和变量的符号。
    • common-lisp-user− 它使用 common-lisp 包和所有其他带有编辑和调试工具的包;简称为cl-user
  • LISP 中的包函数

    下表提供了用于创建、使用和操作包的最常用函数 -
    序号 功能及说明
    1
    make-package 包名&key :nicknames :use
    它创建并返回一个具有指定包名称的新包。
    2
    in-package 包名&key :nicknames :use
    使包成为当前包。
    3
    in-package 姓名
    这个宏导致 *package* 被设置为名为 name 的包,它必须是一个符号或字符串。
    4
    find-package 姓名
    它搜索一个包。具有该名称或昵称的包裹被退回;如果不存在这样的包,则 find-package 返回 nil。
    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 CAINIAOYA")
    )
    (hello)
    (in-package dick)
    (defun hello () 
       (write-line "Hello! This is Dick's CAINIAOYA")
    )
    (hello)
    (in-package harry)
    (defun hello () 
       (write-line "Hello! This is Harry's CAINIAOYA")
    )
    (hello)
    (in-package tom)
    (hello)
    (in-package dick)
    (hello)
    (in-package harry)
    (hello)
    
    当您执行代码时,它返回以下结果 -
    
    Hello! This is Tom's CAINIAOYA
    Hello! This is Dick's CAINIAOYA
    Hello! This is Harry's CAINIAOYA
    
  • 删除包

    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 CAINIAOYA")
    )
    (in-package dick)
    (defun hello () 
       (write-line "Hello! This is Dick's CAINIAOYA")
    )
    (in-package harry)
    (defun hello () 
       (write-line "Hello! This is Harry's CAINIAOYA")
    )
    (in-package tom)
    (hello)
    (in-package dick)
    (hello)
    (in-package harry)
    (hello)
    (delete-package tom)
    (in-package tom)
    (hello)
    
    当您执行代码时,它返回以下结果 -
    
    Hello! This is Tom's CAINIAOYA
    Hello! This is Dick's CAINIAOYA
    Hello! This is Harry's CAINIAOYA
    *** - EVAL: variable TOM has no value