gpt4 book ai didi

common-lisp - 为什么许多Common Lisp系统都使用单个package.lisp文件?

转载 作者:行者123 更新时间:2023-12-04 13:30:53 25 4
gpt4 key购买 nike

我看到的许多常用库都使用单个packages.lisp文件在一个位置声明库(系统)中的所有软件包。

由于导出的符号是包定义的一部分,因此这意味着单个源文件不会列出其导出的符号。

在我自己的项目中,我更喜欢一种样式:每个包定义一个源文件,并在文件顶部定义其接口/导出。

我想知道我做错了什么,还是错过了导致偏爱单个packages.lisp文件的基本概念。

如果相关,我还将使用ASDF的:package-inferred-system方法,并使用uiop:define-package代替defpackage来利用它方便的符号遮蔽:mix功能-因为我还没有弄清楚如何:use一个封装内置符号的包,而无需在使用该符号的每个包中重新声明它们的影子。

最佳答案

使用软件包的传统视图

有时在数十甚至数百个文件中使用package(符号命名空间),可能需要计算软件包。在一个文件中这可能会更简单,并且在一个文件中包含程序包声明时可能更容易获得文本概述。例如,文本编辑器的实现可以仅用一个包使用大约100个文件。还要注意,包实际上是Common Lisp中带有programmer interface的运行时数据结构。

来自其他语言(如Java)的影响

具有一个程序包和一个相应的源文件的样式通常来自Common Lisp之外,其语言通常对应于一类=一个命名空间=一个文件的对应关系。这导致在嵌套目录中存在大量文件,每个文件通常只有一小段代码。

通用Lisp没有这些限制:方法不是在类中组织的,类不是名称空间,文件可以具有各种定义的组合,... Lisp库往往具有大的包/名称空间和大文件。

结构及其局限性

配套

Common Lisp中的Packages是符号的名称空间。这不是一个完善的模块系统。也没有隐藏任何实际信息。符号和导出符号之间有区别。另请注意,符号作为名称具有多种含义(变量,函数/宏/特殊运算符,类名称,插槽名称,类型,数据对象,程序包名称...),并且从程序包中导出符号并没有区别。在这些含义之间。还请注意,可能但不建议在一个文件中使用多个软件包名称空间(例如,使用多个in-package形式)。通常,一个文件中只有一个名称空间。通常由文件顶部某个位置的in-package声明。

班级

类不是名称空间。通常,使用称为CLOS的内置Common Lisp对象系统定义类。它们捆绑插槽,并用于CLOS通用功能中的分派。但是它们不包含其方法。

系统篇

系统不是语言构造。它们是Common Lisp的扩展。系统的想法由ASDF之类的工具提供。系统是用于组织一堆文件的工具,这些文件构成一个库/应用程序及其依赖项。它也是提供使用系统上的操作(编译,加载,交付等)的功能的地方。

???

可能缺少一些东西,无法更好地组织代码。每个项目可能需要略有不同的方式。

我通常会使用文件将相关功能放到一个文件中,并为系统设置一堆文件(如果需要)。但这可能意味着一个文件实现了多个类和许多功能。我倾向于在实现直接相关代码的部分中组织文件。我可能会在文件顶部描述一些元素(类,函数),但这将更多地是本地概述,而不是导出符号的列表。一旦使用其IDE将系统及其文件加载到Lisp中,开发环境的目的就是让我查询代码(在哪里?谁使用?使用什么?子/超类?包内容?。 ),并为此提供浏览器。

有其他组织代码的方法。例如,使用PROVIDEREQUIRE,它们在语言标准中仅作了非常简单的描述。这些趋向于按需引入功能并在旅途中创建包结构。

可能需要诸如面向对象的协议之类的东西,它为CLOS提供了更多的结构。

MIT Lisp Machine操作系统中早期使用软件包和系统

早期对软件包以避免名称冲突和系统组织代码的要求之一来自MIT在70年代和80年代末开发的Lisp Machine操作系统。它是在Lisp Machine Lisp中开发的,后来在Common Lisp中开发的。在那里,许多不同的功能(编译器,编辑器,侦听器,检查器,邮件客户端,图形库,文件系统,串行接口,以太网接口,网络代码等)正在单个地址空间中运行,可能有成千上万个符号。包声明通常是在相应的系统描述文件中完成的(这里我们再次使用Lisp的含义作为库或应用程序,出于特定目的使用文件的集合)或有时在单独的文件中进行。包为大型库甚至整个应用程序提供了名称空间。因此,文件,包,系统甚至类(以前称为Flavors)已被用于构造软件实现。参见《 Lisp机器手册》(1984年版),第29章,Maintaining Large Systems和1984年从Kent Pitman的MIT AI Memo 801:The Description of Large Systems。 Lisp机器上的系统具有版本并支持补丁(增量版本更改)。文件也有版本。

关于common-lisp - 为什么许多Common Lisp系统都使用单个package.lisp文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45642330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com