问题标签 [on-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 回答
1124 浏览

macros - 从 On Lisp 学习 Scheme 中的宏

我真的很想学习 Scheme 宏。我浏览了“On Lisp”的内容,很多章节都专门介绍了 Lisp 宏。但是我不知道常见的lisp。我可以用它来学习 Scheme 宏吗?

0 投票
3 回答
521 浏览

lisp - 奇怪的 Lisp 引用场景 - Graham's On Lisp,第 37 页

我正在阅读格雷厄姆的书“On Lisp”,但无法理解第 37 页的以下示例:

有谁明白这里发生了什么?这严重破坏了我对引用所做的心理模型。

0 投票
1 回答
279 浏览

lisp - Bizarre quoted list example from On Lisp

This passage from On Lisp is genuinely confusing -- it is not clear how returning a quoted list such as '(oh my) can actually alter how the function behaves in the future: won't the returned list be generated again in the function from scratch, the next time it is called?

If we define exclaim so that its return value incorporates a quoted list,

Then any later destructive modification of the return value

could alter the list within the function:

To make exclaim proof against such problems, it should be written:

How exactly is that last call to exclaim adding the word goodness to the result? The function is not referencing any outside variable so how did the separate call to nconc actually alter how the exclaim function works?

0 投票
1 回答
129 浏览

common-lisp - 在 Lisp 的 #[ 读取宏中引用的必要性?

我正在阅读 On Lisp,但无法弄清楚为什么下面的代码使用了引号。以下是文本的摘录:

为用户保留的另一个字符组合是#[。图 17.3 给出了一个例子,说明如何将这个字符定义为一种更精细的左括号。它定义了一个 #[xy] 形式的表达式,以将其读取为 x 和 y 之间所有整数的列表,包括:

图 17.3:定义分隔符的读取宏。

我不明白为什么do** 的结果表单中的行是 **(list 'quote (nreverse accum)))而不是 (nreverse accum)。因为我们可以毫无问题地运行下面不使用引号的代码,对吧?

有人知道这里的诀窍吗?

0 投票
1 回答
1050 浏览

lisp - 宏在 common lisp 中的延续——关于 OnLisp 中的实现

Lisp中,第 267,Paul Graham 提供了延续传递宏的实现:

下面的代码为一棵树t2的每个叶子遍历一棵树t1,使用这个实现,我想知道restart调用时会发生什么,特别是在叶子t1A(第一个元素)更改为B(第二个元素)之后。当restart被调用时,它只是简单地从 中弹出一个 lambda 函数*saved*,然后该 lambda 函数再次调用dft-nodewith (cdr tree)。但是这个调用是在最外层范围之外=bind进行的,并且=bind是负责绑定的*cont**cont*那么,外部引入的绑定如何=bind仍在范围内呢?

最后一种形式展开为

这产生(a 1). 根据 Graham 的说法,后续调用restart应该产生(a 2),等等,直到(a 5),然后后续调用应该产生(b 1), (b 2),等等,直到 finally (g 5)

之后(a 1)*cont*建立的绑定let应该不再存在。后续如何调用restart这些值?的范围是否let仍然适用于单独的调用restart?这里发生了什么?

0 投票
1 回答
61 浏览

common-lisp - 这是对 Graham 的 OnLisp 第 23 页勘误表中“我们的发现”的一个很好的更正吗?

Paul Graham 的“On Lisp”勘误页指出:

页。23. 如果没有元素匹配,our-find-if 将无限递归。被马库斯·特里斯卡抓住。

书中所示的函数定义为:

这是我可能很糟糕的解决方法:

这个对吗?我的 'our-find-if' 版本仍然是尾递归的吗?(我认同...)

欢迎更好的选择。

TIA

0 投票
1 回答
610 浏览

tree - 这真的是广度优先搜索吗

OnLisp 的 P.303 上有一段广度优先搜索的伪代码,如下所示。对于下图,它将首先处理节点 1,然后将节点 2、3 和 4 放入队列中,然后再次迭代调用自身。然后,它将继续处理队列开头的节点 4。这反过来会将节点 7 和 8 放入队列的开头,依此类推。

最后,它遍历的路径将是 1->4->7-11->12->8->3->2->5->9->10->6,这是深度优先搜索。我在这里错了吗?

在此处输入图像描述

0 投票
3 回答
3985 浏览

linked-list - 使用 common lisp 展平列表

我正在阅读 Paul Graham 的《On Lisp》一书。在第 4 章“实用函数”中,他给出了对列表进行操作的小函数的示例,这对编写较大的程序很有帮助。

其中之一是flatten。给定任意级别的嵌套列表作为参数,flatten 将删除所有嵌套元素并将它们放在顶层。

以下是我实现扁平化的尝试:

但是上面的函数不能正确地展平列表。

(1 (2))使用返回(1)而不是调用函数(1 2)

我找不到我的扁平化实现有什么问题。是我使用的方式 labels吗?还是我使用dolist宏的方式?dolist宏总是nil返回。但这并不重要,因为我正在使用累加器acc来存储展平列表。

0 投票
1 回答
75 浏览

lisp - 关于继续使用 OnLisp

我仍然对已回答的问题感兴趣。

宏在 common lisp 中的延续——关于 OnLisp 中的实现

如果 Paul Graham 的假设是正确的,尤其是从 (A 5) 变为 (B 1) 时会发生什么?cont与这里有什么关系?

当文字说

=bind,旨在以与多值绑定相同的方式使用。它接受参数列表、表达式和代码体:参数绑定到表达式返回的值,并使用这些绑定计算代码体。

我无法直接从 =bind 的宏定义中看到绑定,它看起来像

绑定是否仅在 =values 稍后出现时发生?

0 投票
1 回答
108 浏览

lisp - 关于 Prolog 的实现

我只想将处理 lisp 查询的功能添加到 OnLisp 文本中的初始 Prolog 实现中。由于此功能在以下章节(新实现)中介绍,因此我只是从新实现中复制并进行了一些修改。

这是我修改/添加的函数/宏。

但是当我运行下面的代码时,它抱怨没有定义一个变量。

我跟踪了 =gen-lisp 并扩展了宏“with-binds”,但没有发现任何有趣的东西。

有什么想法吗?

顺便说一下,这是完整的代码

https://drive.google.com/file/d/0B7t_DLbSmjMNRVh5SDBXdUVheDg/view?usp=sharing

提前致谢。