clisp语言中的包

发布: 2008-07-23 07:54

1. 包简介

clisp中的包就像一个名字空间一样,可在包中定义变量、函数等
包的另一个作用分离不同功能的模块代码组织。
包具有导入导出的概念,有特定关键字实现这个功能。

make-package 包声明函数
(make-package package-name &key nicknames use)

package-name 包名字
&key 表示后面的参数使用键名/值表示法传入参数。
nicknames 简化名称列表结构,可叫几个不同的名字,如 '("temp" "TEMP" "tmp")
use 引入的包列表结构,可以引入多个。

CL> (make-package "cl_test" :nicknames "ct" :use 'cl-user)


defpackage 包声明宏
(defpackage defined-package-name (:nicknames nickname*)* |
(:documentation string) |
(:use package-name*)* |
(:shadow {symbol-name}*)* |
(:shadowing-import-from package-name {symbol-name}*)* |
(:import-from package-name {symbol-name}*)* |
(:export {symbol-name}*)* |
(:intern {symbol-name}*)* |
(:size integer) )

这个宏用于修改make-package声明的包的某些属性,如简化名,引入的包等。
对于还没有使用make-package声明的包,这个宏会报错误。


EXT:RE-EXPORT 函数
(EXT:RE-EXPORT FROM-PACK TO-PACK)
该函数将包from-pack中的符号(如,变量、函数等)导入到包to-pack中,
即通过两都可以引用包from-pack中的所有符号。

ext:package-case-inverted-p 函数
(package-case-inverted-p defined-package-name)
defined-package-name 为包名字符串,如"foo"
该函数测试包的case-inverted属性,如果为真返回T,否则返回NIL。
这个函数是可SETF的,即可使用下述语句修改此属性的值:
CL> (setf (package-case-inverted-p "foo") T)
T
CL> (setf (package-case-inverted-p "foo") NIL)
NIL

ext:package-case-sensitive-p 函数
(package-case-sensitive-p defined-package-name)
defined-package-name 为包名字符串,如"foo"
该函数测试包的case-sensitived属性,如果为真返回T,否则返回NIL。
这个函数是可 SETF 的,使用方法与上个函数相同。

2. 包的锁定及解锁

ext:package-lock 函数
clisp中的包可以锁定。当包被锁定后,你就不能改变包中符号的值,也不可以重新定义
包中的函数了。如果你这么做clisp就会报错。但是请注意这时候你在程序中是可以引用
包中的函数,或者调用包中的函数,这个锁类似只读锁。
函数package-lock返回布尔值,表示参数所代表的包是否已经锁定。
默认定义的系统带的包都是锁定的,cl-user包除外。clisp自带的包列表在变量custom:*system-package-list*中
和custom:*package*中。

(package-lock defined-package-name)
该函数是可 SETF 的。

CL> (package-lock "foo")
NIL
CL> (setf (package-lock "foo") T)
T
CL> (package-lock 'ext)
T

ext:without-package-lock 宏
该宏可用于临时性解锁某包,以便对包进入一些修改。
(without-package-lock ("foo1" "foo2") ())
(without-package-lock () () ) 这个表达式解锁所有系统中的包。

3. 包 COMMON-LISP-USER

包 common-lisp-user 导入了 common-lisp 包和 ext 包。
一般来说,这个包就是用户clisp程序的默认所在包。
CL> (format nil "~a" *package*)
"#"

4. 实现相关的包

"“CLOS"
该包导出了所有 CLOS 相关的符号,包括一些附加符号。

"SYSTEM"
该包简化名为 "SYS" 和 "COMPILER", 它没有导出符号,它定义了许多系统内部的东西。
也就是说我们在应用编程的时候使用不到该包中的东西,只在编写CLISP本身的时候用到。

"EXT"
这是一个汇总包,该包导入并ext:re-export了所有CLISP扩展中的符号,因而一般情况下导
入这个包就可以使用所有的扩展包了。该包导入了包(除"COMMON-LISP"外):
“POSIX”, “SOCKET”, “GSTREAM”, “GRAY”, “I18N”, “CUSTOM”.

"CHARSET"
定义并导出了一些字符集,以便用于ext:make-encoding和 :external-format 参数。

"FFI"
该包定义了 foreign function interface 调用接口,只在某些平台可用。
外部函数调用接口: 指的是调用非lisp代码调用,常见如直接调用C/C++共享库中的代码。

"SCREEN"
该包定义了 随机屏幕访问 相关API,只在某些平台可用。

"CS-COMMON-LISP"
"CS-COMMON-LISP-USER"
这两个包是 "COMMON-LISP" "COMMON-LISP-USER" 包大小写相关的版本。


现有包中除了"COMMON-LISP-USER"之外的所有包都是clisp实现的。使用的时候注意,
在不同的lisp变体中可能没有。

查看系统中实现的包,可执行
CL> (format nil "~a" *system-package-list*)
"(READLINE REGEXP POSIX I18N EXPORTING CS-COMMON-LISP SYSTEM COMMON-LISP EXT GRAY CHARSET CLOS
SOCKET GSTREAM FFI SCREEN)"


原文: http://qtchina.tk/?q=node/193

Powered by zexport