- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我看到的许多常用库都使用单个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中,开发环境的目的就是让我查询代码(在哪里?谁使用?使用什么?子/超类?包内容?。 ),并为此提供浏览器。
有其他组织代码的方法。例如,使用PROVIDE和REQUIRE,它们在语言标准中仅作了非常简单的描述。这些趋向于按需引入功能并在旅途中创建包结构。
可能需要诸如面向对象的协议之类的东西,它为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/
你们能帮帮我吗,这是我们的讲师给我们的教程问题,无论我们尝试了多少,我们实际上似乎都无法破解它。请帮忙 ; perform some type/error checking, ; then ca
在 Common Lisp 中编写、编译和测试一个函数,该函数接受一个列表并计算列表中正整数的总数。必须编译然后执行包含函数的 .lisp 文件。在编译该文件后开始传递它,列出要生成的结果的结果,从而
我是 Lisp 初学者,我很难理解为什么下面的代码会给我一个错误。 (dolist (elem '(mapcar mapcon)) (when (fboundp `
我听说 Lisp 可以让你重新定义语言本身,我也试图研究它,但没有任何地方明确的解释。有人有一个简单的例子吗? 最佳答案 Lisp 用户将 Lisp 称为 可编程编程语言 .用于符号计算 - 用符号计
Closed. This question is off-topic. It is not currently accepting answers. Learn more。 想改进这个问题吗Updat
这些是 cons 参数的不同组合的输出。我刚开始学习 lisp。有人可以帮我理解这些吗? Break 80 [81]> (CONS '(A) 'B) ((A) . B) Break 80 [81]>
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我想问一下为什么这个功能不起作用... (defun nenum(ls) (cond ((null ls) nil) ((listp car(ls)) (nenum (rest ls)
如果我有一个原子,例如“a4”,我需要能够将 1 添加到“4”部分以使其成为 a5,但是因为它被认为是一个字符串,所以这是不可能的,所以如果我可以拆分 (a4 ) 到 ((a)(4)) 中,然后我可以
我有一个关于动态构建函数(或类似的东西)的问题。在 Java 中,我可以通过编程将一些 Source 写入字符串,编译该字符串并像函数一样执行它多次。 假设我有一些遗传算法来创建最佳代码以获取 n 个
我是 Common Lisp 的新手,正在学习教程,但无法全神贯注 (equal '(reverse (a b)) '(b a))) 返回零。 非常感谢您的协助。 M. 最佳答案 在 lisp 中引
我有一个使用列表表示的树。例如: (1 ((2 (3)) (3 (2)))) (2 ((1 (3)) (3 (1)))) (3 ((1 (2)) (2 (1)))))` 现在我需要在维护层次结构树的同
在此站点:http://www.gigamonkeys.com/book/practical-a-simple-database.html有如下列出的用户入口函数: (defun prompt-rea
我对 lisp 比较陌生,对在以下上下文中使用嵌套列表的最佳方法很好奇: 所以,我有以下功能: (defun get-p0 (points) (loop for (label x y) in
我正在为 CLOS 类编写一个函数,该函数反转所述类对象的列表元素。 我有一个返回反向列表的方法,但如何让它将对象的列表设置为该列表?我可以在存储列表的函数中有一个实例变量,然后将元素设置为那个吗?或
我知道,严格来说,没有编译语言或解释语言这回事。 但是,一般来说,LISP 是用来编写 Python、bash 脚本、批处理脚本之类的脚本的吗? 还是像 C++、JAVA 和 C# 这样的通用编程语言
在此站点 http://jatha.sourceforge.net/快速函数的示例是通过递归。是不是递归通常比 Lisp 中的迭代更快并且性能更好? 编辑:Lisp 是否比其他语言更优化递归? 最佳答
另一个新手(常见)LISP 问题: 基本上在大多数编程语言中,函数都有一种方法接收对变量的引用而不仅仅是值,即通过引用传递而不是通过值传递。比方说,为了简单起见,我想编写一个 LISP 函数来接收一个
这个问题在这里已经有了答案: How do I find the index of an element in a list in Racket? (3 个答案) 关闭 9 年前。 如果我有这样的列
我在为这个程序生成正确的输出时遇到了一些问题。我的输出几乎是正确的,但缺少一些步骤。我的代码如下: (defun kt (x y m n) ;set the
我是一名优秀的程序员,十分优秀!