问题标签 [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 投票
2 回答
731 浏览

common-lisp - lisp 中的破坏性排序

我正在阅读Practical Common Lisp。在第 11 章中,它谈到了排序:

通常,您在排序后不会关心序列的未排序版本,因此在排序过程中允许SORTSTABLE-SORT销毁序列是有意义的。但这确实意味着您需要记住编写以下内容:

我尝试了以下代码:

在这段代码中,我们可以看到变量*a*已被sort函数更改。

那为什么书上说有必要做作业呢?

我正在使用 SBCL + Ubuntu 14.04 + Emacs + Slime

编辑: 在@Sylwester 的评论之后,我添加了对的评估,*a*因此很明显该值已更改。

0 投票
1 回答
168 浏览

macros - defmacro形式参数列表中`(&rest xs)`和`xs`之间的区别

在 Practical Common Lisp 的第 8 章,宏:定义你自己的,我们定义一个宏with-gensyms如下:

的目的是(&rest names)什么?如果我们用 just 替换它names,效果似乎是一样的。在这两种情况下,我们都会传入要“gensym-ed”的符号列表。

0 投票
2 回答
152 浏览

macros - 这个宏有优势吗?

我正在阅读 Peter Seibel 的 Practical Common Lisp。在第 9 章中,他将引导读者创建一个单元测试框架,并包含以下宏来确定列表是否仅由真表达式组成:

不过,我不清楚在这里使用宏有什么好处 - 似乎以下内容会更清晰,并且对于动态值更有效:

宏的优势仅仅是它在运行时对于在编译时扩展的任何调用更有效吗?还是它是一种范式?还是这本书只是试图为在宏中练习不同模式提供借口?

0 投票
1 回答
299 浏览

lisp - 在 Common Lisp 中查找名为“multiprocessing”的包

我正在使用 SBCL (SBCL 1.2.13.84-7d75f89) 从这本书中学习 Common Lisp 。我遇到了一个问题,试图找到并加载名为multiprocessing.

这在本书的第29章中

我试过做(ql:system-apropos "multiprocessing"), (ql:system-apropos "thread")(ql:system-apropos "smp")想看看是否有一个使用它的 quicklisp 包。

我也用谷歌搜索过,甚至在Quickdocs上也搜索过,但我似乎在某个地方失败了。

如有任何帮助,我将不胜感激。

0 投票
1 回答
219 浏览

lisp - 如何让 quicklisp 加载 Practical Common Lisp 一书中的代码?

Practical Common Lisp一书随附的代码包括asdf文件。如何使用Quicklisp加载此代码?

0 投票
1 回答
147 浏览

lambda - Practical Common LISP理解第3章

我正在看Practical Common Lisp的第三章。在那一章中,创建了一个类似应用程序的数据库。我一直在理解这个update功能。

我已经在我的编辑器中编写了代码并添加了注释以供我自己理解代码:

之前where给出了一个函数:

如您所见,本书中提供的代码存在一些问题。我将在下面再次列出它们,但留下评论,以便更清楚地了解它们与什么相关。

  1. 乍一看,这看起来像是代码重复。为什么我不能以某种方式使用该where函数,而不是再次编写所有这些if表达式?
  2. 如果funcall(该代码在那一章的书中没有解释......)真的调用了选择器函数,这是对where给定函数的调用的返回值,那么为什么我必须在if那里写所有这些表达式? 这不正是where函数返回的内容吗?符合条件的那些行的选择器?
  3. row为什么在表达式之后有一个when看似属于lambda表达式的?那是返回值吗,因为when表达式不返回任何内容,因此lambda返回更新的行?

我觉得这段代码没有正确解释一些非常高级的语法,我只能猜测这段代码是如何工作的。

对代码的示例调用是:

我试过了,它确实有效。

这是我的“数据库”:

到目前为止,这是完整的代码:

0 投票
1 回答
279 浏览

macros - 使用“once-only”宏

Practical Common Lisp的第 8 章末尾,Peter Seibel 介绍了once-only宏。其目的是减轻用户定义的宏中变量评估的一些微妙问题。请注意,此时我并不想理解这个宏是如何工作的,就像在其他一些帖子中一样,而是如何正确使用它:

以下是一个示例(不正确)人为的宏,它试图展示几个变量评估问题。它声称通过一些增量迭代整数范围,返回范围:

例如,(do-range (i 1 15 3) (format t "~A " i))应该打印1 4 7 10 13然后返回14

问题包括 1) 第二次出现的潜在捕获limit,因为它作为自由变量出现,2) 绑定变量的初始出现的潜在捕获limit,因为它与出现在宏参数中的其他变量一起出现在表达式中, 3) 无序评估,sincedelta将在 之前评估stop,即使stop出现delta在参数列表中,以及 4) 多个变量评估,sincestopstart被评估不止一次。据我了解,once-only应该解决这些问题:

但是,(macroexpand '(do-range (i 1 15 3) (format t "~A " i)))抱怨limit是一个未绑定的变量。如果我改用with-gensyms,它应该只处理上面的问题 1 和 2,扩展会顺利进行。

这是once-only宏的问题吗?是否once-only真的解决了上面列出的所有问题(也许还有其他问题)?

0 投票
2 回答
331 浏览

common-lisp - 为什么 lisp 说这个参数不是列表?

我正在研究 Peter Seibel 的Practical Common Lisp中的 MP3 数据库示例。Seibel 演示了如何使用宏来缩短where函数的代码;所以现在,我正在尝试使用宏来缩短update函数的代码。(包含该update函数的原始版本以供参考。)当我运行我的代码时,以下错误源自倒数第二行 -

我究竟做错了什么?这是我的代码。

- - -编辑 - - -

我想到了。解决方案是制作update一个宏并制作make-update-list一个函数。这样,make-update-list可以在运行时评估字段,并且update仍然可以抽象出一些乏味的 if 语句。以下是更新后的update内容make-update-list

0 投票
1 回答
2221 浏览

common-lisp - 将 2 个列表作为参数的 LISP 函数

在过去的课程中简要介绍了 LISP 之后,我决定先跳起来尝试学习CLISP(阅读Seibel 的 PCL chpt 5)。我的问题是关于编写一个将一组列表作为参数的函数。第一个列表是映射到第二个列表的一系列索引。我想传递一系列索引并让它返回相应的元素。

到目前为止,这是我的代码大纲。我不确定是否可以使用 nth 并将参数列表传递给它。我不确定身体形态应该是什么样子。

系统信息:CLISP 2.49 Win7

列表(x y z)是索引,数据列表(a b c)是任意元素的列表。评估作为数据传递给函数 get-elements。我的这种思路是否走在了正确的轨道上?

非常感谢 LISP 教育中相关主题的提示和指针。

事后分析:在重新检查 chpts 3-4 后,PCL 似乎对于初学者来说有点触手可及(至少对我而言)。我可以输入书上的代码,但我显然对语言的基本结构没有深入的了解。在再次进行 PCL 之前,我可能会尝试一些更温和的 Lisp 介绍。

0 投票
0 回答
64 浏览

loops - 循环宏: using 子句中的括号

Practical Common Lisp 的第 22 章loop解释了(除其他外)在使用宏迭代哈希表时如何同时使用键和值:

解释以以下脚注结束:

不要问我为什么LOOP's 的作者对子条款的无括号样式感到畏缩using

这对这本书来说非常好,我不怪 Peter Seibel 不知道。尽管如此,我还是对这个设计决策的原因有些好奇。为什么语法不像

更容易解析吗?还是背后有更深层次的原因?