问题标签 [practical-common-lisp]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
152 浏览

common-lisp - Common Lisp 新手,无法理解为什么 defun 函数在简单情况下不起作用

在“Practical Common Lisp”的第 3 章中,我们被要求通过创建函数来创建 CD 数据库,函数make-cd定义如下:

在我的 REPL(使用 SLIME)中,这似乎按计划进行......直到我向数据库添加一个值,例如

然后我收到以下错误消息

此代码是书中所写的逐个字符,没有注释来解释错误或此错误的含义。

我是 Lisp 新手,不知道这里出了什么问题!

0 投票
0 回答
146 浏览

lisp - 在 Racket 中写入(y-or-np)

我正在使用 Racket 浏览 Practical Common Lisp。我正在尝试编写一个提示用户输入的函数,如果他们不输入“yes/y”“no/n”,则会重新提示他们。

除了一个错误之外,它几乎完全符合我的要求。打电话

我必须按两次输入才能接受答案,这给了我一个未绑定的标识符错误。有谁知道出了什么问题?

PS我正在使用Racket V 7.0。在 Emacs 中使用球拍模式运行。

0 投票
2 回答
102 浏览

common-lisp - Common Lisp 共享结构混淆

我在看Practical Common Lisp这本书,在第22章的脚注5,第284页,我看到了一段让我感到困惑的代码片段。

我知道变量 list 和 tail 有一个共同的列表结构,但我很困惑,因为 tail 在迭代期间每次都会被分配 'new' 的值,为什么 (setf (cdr tail) new) 会影响状态变量列表的?</p>

0 投票
2 回答
207 浏览

vector - 如何保护矢量不调整大小?

所以我再次经历了 Practical Common Lisp,我无法真正理解如何创建一个具有恒定大小的向量。

根据书:

然而,即使是带有填充指针的向量也不能完全调整大小。向量 *x* 最多可以包含五个元素。要制作任意大小的向量,您需要传递 MAKE-ARRAY 另一个关键字参数::adjustable。

但是,当我使用时,(vector-push-extend)即使我设置:adjustable nil(或保持默认),我也可以扩展我的初始向量。

我假设(vector-push-extend)不能调整不是数组的大小:adjustable?创建非动态(不可调整)数组的正确方法是什么?

0 投票
1 回答
64 浏览

common-lisp - 如何在我的 Mac 上安装 aserve 并将其加载到 lispbox-0.7 中?

我在“Practical Common Lisp”(优秀书籍)的第 26 章。我正在尝试解决这个问题,从https://github.com/Apress/practical-common-lisp下载:

这给出了这个错误:

克隆https://github.com/franzinc/aserve.git后 我跑了:

但出现错误:

我找不到包 EXCL,所以我安装了portableaserve 并运行:

但又得到了:

有人知道如何在 Mac 上的 lispbox-0.7 中安装包括 EXCL 在内的 allegroserve 以运行上述 defpackage 命令吗?

0 投票
1 回答
89 浏览

lisp - Common Lisp 方法专门用于符号 - 不能在其他包中使用,不能导出?

我一直在研究Practical Common Lisp二进制解析器项目,并试图将泛型(类和宏定义)和细节(特定类型和方法实现)拆分到不同的包中。因此,我有以下代码:

在 packages.lisp 中:

在 binparse.lisp 中:

在primitives.lisp中:

我一直无法确定如何正确地从primitives. 如果我不做任何超出packages上面定义的导出,那么我可以执行以下操作:

但是,我不知道如何导出'u1(或用作方法说明符的其他符号)primitives以避免双冒号或可能允许导入其他包。包括(:export :u1)defpackage不起作用。(export 'u1)已经在 中时也不会调用primitives。与双冒号不同,单冒号不允许::'u1原来的工作。

从PCL扩展项目,这似乎是一件相当正常的事情,在一个包中定义基本的二进制解析器代码,以便在其他地方用于特定的扩展,但我不知道该怎么做并且没有没有找到其他人询问它。

0 投票
1 回答
74 浏览

lisp - `#'(lambda...` 和 `(lambda...` 之间有区别吗?

Practical Common LispREMOVE-IF-NOT中有一个使用 lambda的示例:

这与以下有什么不同:

值是否(lambda..)与引用函数形式一致#'(..)?在 REPL 上似乎是这样,但由于我是 Lisp 的新手,我可能会忽略一些东西(我肯定用词有误,所以也请纠正我)。

0 投票
3 回答
81 浏览

lisp - 使用 macroexpand-1 在 let 表单中展开宏(Practical Common Lisp,第 8 章,“堵漏”)

在 Practical Common Lisp 的第 8 章“堵漏”中,我们定义了这个宏,并通过检查发现它泄漏了macroexpand-1

由于此泄漏,以下看似无辜的 do-primes 调用无法正常工作:

(do-primes (ending-value 0 10) (print ending-value)) 这个也不是:

(let ((结束值 0)) (do-primes (p 0 10) (incf 结束值 p)) 结束值)

我可以macroexpand-1像这样使用它,我将这个宏命名为 do-primes4

但是我不能在第二种形式上做同样的事情,其中​​宏调用是用 let

它似乎实际上并没有对 do-primes4 进行宏扩展。我正在使用 SBCL。