问题标签 [lisp-macros]

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 回答
95 浏览

lisp - Common Lisp 执行表达式作为宏中的参数

因此,使用 common lisp,我希望能够执行以下操作:

结果打印 1 5 次。我不想简单地直接调用 (print 1),而是通过宏参数传递表达式并通过宏调用它。换句话说,宏 foo 应该处理任何表达式作为输入并运行它。这种情况似乎不起作用。

编辑以阐明明确的脚本和预期功能。

0 投票
1 回答
66 浏览

lisp - 从 plist 宏体中提取和执行闭包/lambda

我正在尝试创建一个bar应该像这样使用的宏():

宏应该基本上只是在考虑 MY-VAR 的情况下 FUNCALL lambda。

我想出的是:

这有效,它打印“foo”。但我想知道这是否是这样做的,或者是否有更好的方法来做到这一点。

0 投票
1 回答
97 浏览

lambda - Common Lisp 中的 lambda 表达式是宏还是标记?

我正在尝试通过Common Lisp:符号计算的简单介绍一书来学习 Common Lisp 。此外,我正在使用 SBCL、Emacs 和 Slime。

在第 7 章中,作者提出了以下关于lambda expressions在此处输入图像描述

这让我很困惑,因为 SBCL 的 REPL 返回:

显然,作者使用了Lisp Works(不是 100% 肯定)。我认为这与上述差异无关。不过,我觉得还是提一下比较好。

我的 SBCL 的 REPL 也返回macro众所周知的宏,例如and

请注意,具有“普通”功能的行为append是不同的:

这里的这篇文章似乎略微触及了lambda 表达式的非单一性质。但是,它没有提到任何关于标记的内容。

我是否错过了一些关于 lambda 表达式的本质的东西?

0 投票
1 回答
66 浏览

common-lisp - 通用 lisp 宏不调用函数

我正在处理一个复杂的宏并且遇到了障碍。

我得到“评估中止 #<UNDEFINED-FUNCTION NEXT-ENTRY {100229C693}>”我不明白为什么下一个条目似乎对我创建的宏不可见。

我已经尝试将其简化为一个可复制的小示例,但是如果没有我创建的宏,我找不到一个最小的场景,无论我尝试什么,除了这个场景之外,下一个条目将是不可见的,我总是设法找到一种方法在我的其他示例中调用 next-entry 所以我很难理解为什么我不能让它在这里工作

我已经测试了我创建的 for 宏,它似乎在大多数情况下都能正常工作,但由于某种原因,它看不到这个 next-entry 变量。我如何使它可见?

0 投票
1 回答
69 浏览

macros - 为什么这个在 Common Lisp 中漂亮地打印宏扩展的宏不起作用?有哪些替代工具?

我正在尝试通过Common Lisp:符号计算的简单介绍一书来学习 Common Lisp 。此外,我正在使用 SBCL、Emacs 和 Slime。

在第 14 章,最后一章,作者介绍了。他提出了一个名为PPMX“Pretty Print Macro eXpansion”的工具。

使用此工具,您可以:

该工具是独立的,因为本书为其提供了代码定义:

不幸的是,我无法运行它,因为编译不起作用。Slime 的 REPL 会抛出这个错误:

逗号和左单引号在 emacs 中看起来与在 SO 中不同: 在此处输入图像描述

在将代码从书中复制到 emacs 时,我遇到了一些问题。它基本上是插入'而不是左单引号。

1 - 有没有办法解决这个问题?

2 - 这本书写于 1980 年代后期。因此,我敢打赌现在有更好的工具。Slime 或 SBCL 是否提供一些命令来漂亮地打印宏扩展?也许是图书馆或其他包?

谢谢。

0 投票
1 回答
69 浏览

macros - 为什么在我的环境中编译 Common Lisp 宏会产生与书中不同的结果?有可能达到同样的效果吗?

我正在尝试通过Common Lisp:符号计算的简单介绍一书来学习 Common Lisp 。此外,我正在使用 SBCL、Emacs 和 Slime。

在第 14 章,最后一章,作者介绍了宏。在关于编译它的一节中,他提到:

由于宏扩展可以随时发生,因此您不应编写会产生副作用的宏,例如赋值或 i/o。但是宏可以扩展为产生副作用的表达式。

作为说明不良宏的一种方式,他提供了以下示例:

当我尝试在我的环境中模仿相同的内容时,我有不同的输出:

如您所见,在编译函数时,Hi mom!缺少该部分。

为什么会这样?这仅仅是因为 Lisp 实现的不同吗?是否有可能实现相同的输出?

我不认为是这样,但我会从书中放一个打印屏幕,以防这与从 pdf 复制并粘贴到 Emacs Slime 的 REPL 中有关。

在此处输入图像描述

0 投票
1 回答
58 浏览

macros - 在 SBCL Common Lisp 实现中,宏扩展何时以及多久发生一次?

一些 Lisp 实现 (i)一次扩展宏并保存结果以供 重用;(ii) 其他人在每次宏调用时重新展开宏。一些实现 (iii) 甚至尝试在函数被 DEFUN时扩展函数体 中的宏调用。

SBCL 是哪一种?

谢谢。

0 投票
1 回答
42 浏览

racket - 寻找一个非常简单的球拍宏示例

我这样做了:

这是做什么的

它在扩展时替换(macro-expandsion-seconds)(current-seconds),并且每次仍然评估该形式。

但是我如何让它(current-seconds)在扩展时进行评估,然后这样做呢?

我知道在这种情况下我可以这样做

和这个

(名字不再有意义)

但我试图弄清楚宏是如何工作的,并认为这将是一个简单的例子,可以帮助我找出更难的例子。

0 投票
1 回答
56 浏览

racket - How can I see expanded macros in racket?

I got this answer https://stackoverflow.com/a/70318991 about writing a simple macro that records the time at macro expansion time, and then always returns that time.

It works great, but now is there an easy way to see an expanded version of (macro-expansion-seconds) without evaluating it? (for debugging more complicated ones)

0 投票
1 回答
44 浏览

scheme - 在 Scheme 中生成 cond(测试表达式 ...)

我已经使用 Guile 大约一年了,但在 Scheme 中使用宏的经验相当缺乏。尽管我有一些更复杂的示例可以令人满意地工作,但我仍然坚持(对我来说)感觉像是一个非常简单的用例,类似于类似于#defineC中可以实现的简单替换。

我有一个cond用于测试多个条件的函数,其中一些具有通用形式。例如:

我想摆脱围绕以下表格条件的重复:

这对我来说就像一个宏,因为这个样板可以在编译时使用模式匹配生成——我天真地尝试过这样的事情:

这确实在 REPL 中重现了(测试表达式)s 表达式:

但是当我尝试将宏插入我的时,cond我收到以下错误:

我很天真地添加它,就像下面一样 - 我已经注释掉了 cond 中的样板,它围绕着“fold along x =”样板,它意味着要替换:

自从这次尝试以来,我一直在, 和许多其他宏的变体中陷入困境,并syntax-case尝试使其工作。quasisyntaxcond

但是,我显然没有得到关于宏可以“插入替换”片段或表达式的一部分来代替它们的方式的根本重要的东西。

谁能帮我看看我的方式的错误?

如何编写一个可以生成要在 - 子句中使用的测试和表达式的宏cond?而且 - 这是一件合理/明智的事情吗?