drswinghead

主站网址

导航

clisp语言中的包

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)"

posted on 2010-06-12 14:33  drswinghead  阅读(301)  评论(0编辑  收藏  举报