level 9
;;;;-*- coding: utf-8-unix; -*-
;;;; 注释写这里
(in-package :cl-user)
(defpackage :your-package-name
(:use :cl)
(:export :foo
:bar))
这里的foo的定义就直接写在这个文件里面吗?
要写在defpackage的前面还是后面?
2014年08月06日 07点08分
1
level 7
:export关键字后边的符号是:your-package-name包内的外部调用接口,只有:export导出的符号才能供外部调用
2014年08月06日 13点08分
3
看四楼。。召唤不成功了。。
2014年08月06日 15点08分
level 9
@阻击手考拉
:export导出我知道,可是你看,如果我load了这个文件,那第一句的in-package会让当前包变成cl-user吧,那后面如果再写foo,bar之类的函数的定义,那么那些函数不就会被添加到cl-user里面去吗?
(晕,这个问题我自己都不知道该怎么表达)
比如说,我将common lisp的包机制类比为C++里的namespace。
然后在一个namespace里面定义属于那个space的函数,需要在一对花括号里面定义函数。
可是在lisp文件里我要把具体的函数定义写在哪里。。。就是这个意思。
2014年08月06日 15点08分
5
回复 Lisp少帥 :额
2014年08月07日 02点08分
level 7
这个问题我也纠结好久,把我理解的说下吧。
1.defpackage只负责定义或者说声明一个包。
2.包是供读取器操作的,这个很重要。因此想要向某个包my-package中加入变量或者函数,需要使用(in-package :my-package)转换成当前包,(in-package :my-package)后的代码为对my-package包的操作。读取器默认操作当前包。
3.对于有多个包的系统,需要使用(in-package :my-xxxxxx)切换为当前包。
4.在稍大点的工程里,一般工程结构是按业务逻辑或者模块划分的,而不是以包的形式划分。以按模块划分举例,可能有多个模块的文件都涉及到对同一个包的操作,我们只需要在mod1/file1.lisp,mod2/file1.lisp里分别(in-package :my-package),然后添加功能源码(需要外部可见就是用(export *(symbol1))导出一下),模块的组织可以使用defsystem或者quickproject之类的工具即可。
我觉得这个问题可以作为一个专题好好讨论一下。想要快速弄清楚包机制最好是学习antik、cffi、cl-ftp等成熟工程的源码结构,一般会有一个独立的package.lisp,然后相关模块会对定义的包进行操作。
2014年08月19日 08点08分
6
听说cffi已经死了,真的吗?最好是推荐个规模不是太大的项目,我怕我看不过来^^
2014年08月19日 09点08分
回复 _湖心龙 :没关系的,想弄清package是怎么回事儿,只看它的工程结构和模块依赖关系就行了,我觉得antik不错
2014年08月19日 09点08分
回复 _湖心龙 :没有吧,cffi活的好好地。官网显示:The latest version is 0.13.0, released on May 29th, 2014 (release notes).
2014年08月19日 09点08分
回复 狙击手考拉 :好的。我去看看
2014年08月19日 10点08分