问题标签 [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.
common-lisp - Common Lisp 新手,无法理解为什么 defun 函数在简单情况下不起作用
在“Practical Common Lisp”的第 3 章中,我们被要求通过创建函数来创建 CD 数据库,函数make-cd
定义如下:
在我的 REPL(使用 SLIME)中,这似乎按计划进行......直到我向数据库添加一个值,例如
然后我收到以下错误消息
此代码是书中所写的逐个字符,没有注释来解释错误或此错误的含义。
我是 Lisp 新手,不知道这里出了什么问题!
lisp - 在 Racket 中写入(y-or-np)
我正在使用 Racket 浏览 Practical Common Lisp。我正在尝试编写一个提示用户输入的函数,如果他们不输入“yes/y”“no/n”,则会重新提示他们。
除了一个错误之外,它几乎完全符合我的要求。打电话
我必须按两次输入才能接受答案,这给了我一个未绑定的标识符错误。有谁知道出了什么问题?
PS我正在使用Racket V 7.0。在 Emacs 中使用球拍模式运行。
common-lisp - Common Lisp 共享结构混淆
我在看Practical Common Lisp这本书,在第22章的脚注5,第284页,我看到了一段让我感到困惑的代码片段。
我知道变量 list 和 tail 有一个共同的列表结构,但我很困惑,因为 tail 在迭代期间每次都会被分配 'new' 的值,为什么 (setf (cdr tail) new) 会影响状态变量列表的?</p>
vector - 如何保护矢量不调整大小?
所以我再次经历了 Practical Common Lisp,我无法真正理解如何创建一个具有恒定大小的向量。
根据书:
然而,即使是带有填充指针的向量也不能完全调整大小。向量 *x* 最多可以包含五个元素。要制作任意大小的向量,您需要传递 MAKE-ARRAY 另一个关键字参数::adjustable。
但是,当我使用时,(vector-push-extend)
即使我设置:adjustable nil
(或保持默认),我也可以扩展我的初始向量。
我假设(vector-push-extend)
不能调整不是数组的大小:adjustable
?创建非动态(不可调整)数组的正确方法是什么?
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 命令吗?
lisp - Common Lisp 方法专门用于符号 - 不能在其他包中使用,不能导出?
我一直在研究Practical Common Lisp的二进制解析器项目,并试图将泛型(类和宏定义)和细节(特定类型和方法实现)拆分到不同的包中。因此,我有以下代码:
在 packages.lisp 中:
在 binparse.lisp 中:
在primitives.lisp中:
我一直无法确定如何正确地从primitives
. 如果我不做任何超出packages
上面定义的导出,那么我可以执行以下操作:
但是,我不知道如何导出'u1
(或用作方法说明符的其他符号)primitives
以避免双冒号或可能允许导入其他包。包括(:export :u1)
在defpackage
不起作用。(export 'u1)
已经在 中时也不会调用primitives
。与双冒号不同,单冒号不允许::'u1
原来的工作。
从PCL扩展项目,这似乎是一件相当正常的事情,在一个包中定义基本的二进制解析器代码,以便在其他地方用于特定的扩展,但我不知道该怎么做并且没有没有找到其他人询问它。
lisp - `#'(lambda...` 和 `(lambda...` 之间有区别吗?
在Practical Common LispREMOVE-IF-NOT
中有一个使用 lambda的示例:
这与以下有什么不同:
值是否(lambda..)
与引用函数形式一致#'(..)
?在 REPL 上似乎是这样,但由于我是 Lisp 的新手,我可能会忽略一些东西(我肯定用词有误,所以也请纠正我)。
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。