问题标签 [define-syntax]

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 投票
4 回答
5920 浏览

macros - 学习 Scheme 宏的来源:define-syntax 和 syntax-rules

我已经阅读了JRM 的 Syntax-rules Primer for the Merely Eccentric,它帮助我理解了语法规则以及它与 common-lisp 的定义宏有何不同。语法规则只是在定义语法中实现语法转换器的一种方式。

我正在寻找两件事,第一是更多示例和语法规则的解释,第二是学习使用定义语法的其他方式的良好资源。你推荐什么资源?

0 投票
3 回答
682 浏览

scheme - 用于嵌套表达式的方案宏

可以用 Scheme 编写一个宏(define-syntax例如,使用 ),它将采用如下表达式:

并将这样的表达式作为输出?

当然,对于任意长度。给定这样的模板,我想不出办法:

0 投票
1 回答
209 浏览

macros - 语法规则中如何使用向量模式?

我一直在写 Common Lisp 宏,所以 Scheme 的 R5Rs 宏对我来说有点不自然。我我明白了,除了我不明白如何在语法规则中使用向量模式:

我看不到如何使用需要将其参数写为向量的宏:

是否有某种使用这些模式的技术?

谢谢!

0 投票
4 回答
1100 浏览

scheme - Scheme 中 letrec 的这个定义有什么问题(如果有的话)?

R5RS 给出了语法库形式的宏定义:

http://schemers.org/Documents/Standards/R5RS/HTML/r5rs-ZH-10.html#%_sec_7.3

这也以非常复杂的方式定义了letrec,当然不是我将如何定义它,我将简单地使用:

据我了解 letrec 的语义,我经常将其用作命名的 let。它以这种方式工作,但是由于我与那些认为他们可以反驳狭义相对论或已建立的语音理论的哲学家进行了相当多的辩论,我知道当你认为你有一个复杂问题的简单解决方案时,它可能是错误的。一定有某个地方这个宏不能满足 letrec 的语义,否则他们可能会使用它。

在这个定义中,定义是 letrec 主体的本地定义,它们可以相互引用以进行相互递归,我不太确定什么(如果有的话)是错误的。

0 投票
1 回答
984 浏览

macros - 方案中的这个定义语法宏有什么问题?

我正在通过 SICP 工作,并想在 guile 中尝试一些示例。我正在尝试流示例并想要一个 cons-stream 的实现,这是我从这个 StackOverflow 问题中得到的。但是,当我将其输入 guile 时,我得到:

我不知道这有什么问题 - 我尝试将 () 替换为 '(),删除 [],但即使它似乎是有效的 R5RS ,它仍然无法正常工作。我目前使用的是 guile 1.8.7,我看不到GNU 文档提到的 v2.0.1 包,这可能是它不适合我的原因吗?

0 投票
2 回答
334 浏览

functional-programming - 可以使用“call/cc”实现“if”吗?

有人告诉我“call/cc”可用于实现任意控制流构造,所以我尝试使用“call/cc”来实现所有此类构造,但我遇到了麻烦。假设我没有“if”,我将如何使用“define-syntax”和“call/cc”来实现它?有可能还是我被误导了?我知道如何使用“call/cc”实现无条件跳转,但在机器级别,条件执行是使用分支指令执行的,分支指令的执行取决于处理器的状态位。如果没有这种类型的构造,我看不到它是如何完成的。

0 投票
1 回答
1318 浏览

macros - Scheme宏扩展:在define-syntax中嵌套let-syntax

我想 展开

进入

我的尝试是:

使用宏步进器,我可以看到宏的第一阶段扩展到

其中,当单独评估时效果很好,但是当作为一个整体执行时,我得到一个关于f未定义标识符的错误。我认为这是范围界定的问题,这种类型的宏扩展可能吗?

0 投票
1 回答
544 浏览

scheme - 方案 R5RS 定义语法被忽略?

刚开始学习Scheme。我使用 Dr. Racket 作为我的编译器/解释器。

我需要一些字符串函数(确切地说是字符串替换),所以我从SRFI 13复制。

当我测试它时,它显示..

这是用

好像被忽略了?究竟发生了什么?

0 投票
2 回答
423 浏览

macros - 球拍宏 - 配对

我刚刚开始深入研究 Racket 宏,并试图制作一个简洁的简单宏定义宏。我想扩展这样的表达式:

变成这样:

所以原始表达式的 cddr 变成了表达式对(用于语法规则主体),并将 id 插入到每对表达式的 car 中。

当仅使用语法规则提供的模式匹配时,我在递归思考时遇到了麻烦(我一直想像操作普通列表一样操作表达式)。我应该使用什么样的模式?或者,我可以以某种方式将其作为普通列表进行操作,然后取消引用结果以用于扩展吗?

非常感谢

编辑 - 暂定解决方案,由 Taymon 的回答提供信息

我在这里的部分好奇心是关于摆脱那些配对括号。我研究了语法案例,但有点困惑,所以尝试纯粹使用模式匹配子语言来做。我最终使用 Taymon 的宏和另一个宏来“配对”给定的模板(它的行为有点像累加器函数):

0 投票
2 回答
382 浏览

macros - Error during expansion of macro in Chicken Scheme

I'm learning how the macro system in Scheme works and I'm trying to make my code look more JavaScript-y. So I thought I would start with the function macro. This is how I want a function definition to look:

It should expand to the following:

So I write a macro as follows:

However when I use it I get the following error (in Chicken Scheme):

Where am I going wrong? In addition how do I read such error messages to be able to debug the program myself?