dram.me

Logtalk中的模块机制

补遗

  1. 这里对Prolog模块的理解不对,模块名是全局的,在SWI和Yap中,都不允许模块名冲突,即使属于不同目录。—— 2017-03-11

Logtalk中并没有模块机制,而是完全依赖对象进行封装和名字空间隔离。

对象直接的依赖采用加载器处理。但这存在一个问题,当出现对象名称冲突时,这个机制无法解决。例如两个lgt文件中同时定义了foo对象,在单个程序中就无法同时使用这两个库。

Prolog主流的模块系统虽然也可能出现名称冲突的问题(包括模块名冲突和谓词名冲突),但可以通过辅助模块包装规避。例如模块a和模块b同时定义了谓词foo,可以定义辅助模块c,封装a中的foo,之后模块b即使不使用模块名前缀机制,也可以间接使用a中的foo了。如果出现模块名冲突,也可以用类似的思路处理。

由于Logtalk中所有对象名都是全局名字,不能像Prolog的名字那样在模块内局部化,所以无法使用类似的机制。