问题标签 [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.
macros - 了解如何实现一次性 lisp 宏
在 Peter Seibel 的《Practical Common Lisp》一书中,我们可以找到非常复杂的一次性宏的定义(参见页面底部http://www.gigamonkeys.com/book/macros-defining-your-own.html)。
我在过去 3 周内第 10 次阅读此宏定义,但无法理解它是如何工作的。:( 更糟糕的是,我无法自行开发此宏,即使我了解它的用途和使用方法。
我对逐步系统地“推导”这个臭名昭著的硬宏特别感兴趣!有什么帮助吗?
common-lisp - Common Lisp's copy-tree: Which objects will be referenced in common by the original and the copy?
I'm reading Practical Common Lisp, and have a question about Lisp's COPY-TREE
function.
The book gives the example of calling
After explaining it, the book makes this statement:
Where a cons cell in the original referenced an atomic value, the corresponding cons cell in the copy will reference the same value. Thus, the only objects referenced in common by the original tree and the copy produced by COPY-TREE are the numbers 5, 6, and the symbol NIL.
But that doesn't make sense to me. I thought all atoms would be shared between the original and the new. Therefore, I expected that 1, 2, 3, 4, 5, 6 and NIL would all be shared between the original and the copy, and that the only "new objects" would be all the CONS cells.
Which one is correct, and why?
Thanks.
lisp - 来自 Practical Common LISP 的第一个练习的格式化问题
我开始通过 Practical Common LISP 工作,第一个练习是编写一个简单的数据库。我在 cygwin 上使用 GNU CLISP 2.48 (2009-07-28)。
这段代码,我已经与本书多次比较,并没有按照书中所说的方式产生输出
我明白了
我不了解format
或 LISP 不够好,无法进行故障排除。这本书说我应该得到数据库中所有记录的列表。出了什么问题?
format - Practical Common LISP 中的 %10t 格式错误
这是该页面的链接:第 3 章,实用:一个简单的数据库。本质上,我有一个包含四个要显示的值的列表数据库。这是用
唯一的问题是输出不太正确:
由于某种原因,“首页”没有从第 10 列开始,有人能告诉我为什么吗?我正在使用 SBCL 运行代码,最新版本。
macros - Common Lisp 宏参数不匹配尽管 &rest / &body
我一直在阅读 Peter Seibel 的书Practical Common Lisp,按照书中出现的顺序从网上提供的书中代码拼凑项目,到目前为止,我有一个文件可以依次编译和加载每一章的代码,并且这是我遇到问题的地方:到目前为止,当我为项目加载 FASL 时,我在 ID3v2 部分收到如下警告。
我不明白参数编号冲突出现在哪里。 UNSIGNED-INTEGER
似乎得到了它的两个关键字参数。此外,在我看来,DEFINE-BINARY-TYPE
宏将使用&rest
/接受任意数量的参数&body
。我想知道您是否有任何提示或建议。一些相关的输出和代码如下。任何和所有的帮助表示赞赏。
提前致谢,
“id3v2.lisp”中的违规函数如下所示,
使用
来自“binary-data.lisp”中的以下内容
lisp - lisp 中的一个名为 xtoy 的函数,它返回一个从 x 到 y 的列表
我对 lisp 很陌生。我正在尝试编写一个名为 x2y 的函数,它接受 2 个整数参数 x 和 y,并返回从 x 开始并以 y 结束的整数列表
macros - 一次性 lisp 宏,我的实现是否正确?
我正在尝试从 Peter Seibel 的书“Practical Common Lisp”中学习 Lisp。在第 8 章:“宏:定义你自己的”中,我遇到了这个只有一次的宏。在该页面的底部,给出了一个实现。现在这对我来说是一个非常复杂的宏,所以我在 stackoverflow 上看到了这个问题,那里有一些很好的解释。
但是,即使我(仍然)还没有完全理解宏,我也理解了它的用途。所以我尝试编写自己的实现:
(如果我没有遵循标准的 lisp 缩进约定,请原谅我,我试图以某种方式缩进代码,以便我可以理解去哪里,因为我是新手)
我测试这个宏的方式与我链接的那一章中描述的方式大致相同,即。使用 (random 100) 之类的参数调用函数,这样如果对它们进行两次评估,结果将是错误的。我还通过macroexpand/macroexpand-1 扩展了我的宏(以及我使用它的宏),这似乎也是正确的。
所以我想知道我的实现是否正确?还是我遗漏了什么(我可能认为)......
common-lisp - Common Lisp:普通变量是 LET 中列表的简写?
我正在阅读Gigamonkey (Peter Seibel's) 的 Practical Common Lisp ,并在宏章节中关于 DO 的部分中遇到了以下声明:
与 LET 中的变量定义一样,如果省略了 init 形式,则该变量将绑定到 NIL。同样与 LET 一样,您可以使用普通变量名称作为仅包含名称的列表的简写。
我不知道他所说的“使用普通变量作为仅包含名称的列表的缩写”,即第二句话是什么意思。第一句在LET 的 Common-Lisp Hyperspec 中得到了支持,并通过一个简单的例子来支持(let (n) n) ~~> NIL
,但我找不到与第二句相对应的任何内容。事实上,类似于(let n n)
SBCL 编译器的东西。
这是什么意思?这种用途的最小例子是什么?
macros - 仅一次的 lisp 宏,另一个实现
我正在尝试从 Peter Seibel 的书“Practical Common Lisp”中学习 Lisp。在第 8 章:“宏:定义你自己的”中,我遇到了这个只有一次的宏。在该页面的底部,给出了一个实现。
我之前尝试为相同的目的实现自己的宏,但它有一个错误,正如在一次仅 lisp 宏中指出的那样,我的实现是否正确?.
这次我做了另一个替代实现,希望能修复这个错误。我想知道这次我的实现是否正确?
common-lisp - ecase 宏中的子句采用包前缀
我正在尝试通过 Practical Common Lisp 工作。我是一个口齿不清的初学者。
我已经使用“quicklisp”定义了一个包我用(ql:quickload:spam filter)加载了这个包
这个包中的一个函数如下所示:
当我尝试调用在 slime 中调用此函数的函数时,case 语句失败。我认为它失败了,因为编译器已将包名称添加为子句的前缀。
这是我看到的错误:
HAM 通过 ECASE 表达下降。想要一个(HAM SPAM)。[SB-KERNEL:CASE-FAILURE 类型的条件]
重新启动:0:[RETRY] 重试 SLIME REPL 评估请求。1: [*ABORT] 返回 SLIME 的顶层。2: [ABORT] 中止线程 (#)
回溯: 0: (SB-KERNEL:CASE-FAILURE ECASE HAM (SPAMFILTER::HAM SPAMFILTER::SPAM)) 1: (SPAMFILTER:INCREMENT-COUNT # HAM) 2: (SPAMFILTER:TRAIN "来自 exmh-users-admin@ redhat.com Mon Sep 23 12:06:27 2002 ..) 3: (SPAMFILTER::TRAIN-FROM-CORPUS #>((#P"/Users/jh/src/lisp/spamfilter/mail/easy_ham/1205. f9d66868c52039f7a147d9e2b4b05e1f" HAM) (#P"/Users/jh/src/lisp/spamfilter/mail/easy_ham/0090.314ec4268af7a3a1974d5e.. 4: (SPAMFILTER:TEST-CLASSIFIER #((#P"/Users/jh/src/lisp/ spamfilter/mail/easy_ham/0001.ea7e79d3153e7469e7a9c3e0af6a357e" HAM) (#P"/Users/jh/src/lisp/spamfilter/mail/easy_ham/0002.b3120c4bcbf3101e661161ee7.. 5: (SB-INT:SIMPLE-EVAL-IN-LEXV (SPAMFILTER:TEST-CLASSIFIER SPAMFILTER: CORPUS 0.1) #) 6: (EVAL (SPAMFILTER:TEST-CLASSIFIER SPAMFILTER:语料库0.1)) --更多--
我的猜测是编译器在 Backtrace 0 上添加了前缀:
0: (SB-KERNEL:CASE-FAILURE ECASE HAM (SPAMFILTER::HAM SPAMFILTER::SPAM))
我确定我遗漏了一些明显的东西。
谢谢。