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

macros - Racket macro for expanding code

I want to be able to write:

instead of:

I know I can do this using macros and tried to write this:

But I get this error:

0 投票
1 回答
457 浏览

macros - 如何从 Chicken Scheme 宏中调用其他宏?

我正在尝试从 Common Lisp 转移到Chicken Scheme,并且遇到了很多问题。

我目前的问题是:如何编写define-syntax调用其他宏的宏(大概使用?)?

例如,在 Common Lisp 中,我可以这样做:

而在 Scheme 中,等效代码不起作用:

append-to不能从宏调用宏something-else。我收到一条错误消息,说append-to“变量”未定义。

根据我从谷歌和其他来源收集到的所有信息,宏是在封闭环境中评估的,无法访问其他代码。本质上,在评估宏时,除了内置的 Scheme 函数和宏之外,什么都不存在。我已经尝试使用er-macro-transformer, syntax-case(无论如何现在在 Chicken 中已弃用)甚至procedural-macros模块。

当然,宏的全部目的是它们建立在其他宏之上,以避免重复代码。如果必须单独编写宏,那么在我看来,它们几乎毫无用处。

我调查了其他方案的实现,但没有更多的运气。似乎它根本无法完成。

有人可以帮我解决这个问题吗?

0 投票
2 回答
342 浏览

macros - 定义多个顶级表单的球拍宏?

我发现自己定义的语法参数除了名称之外具有相同的定义,因此我决定编写一个宏以使其更简单:

但是,不必重复宏名称,我希望能够只写:

但是我不知道如何使用普通的省略号语法来做到这一点,因为我需要将所有内容包装在 abegin中,这将创建一个新的范围,并且我想要所有的语法参数,就好像我已经把它们写在了顶部等级。实现这一目标的正确方法是什么?

0 投票
1 回答
380 浏览

while-loop - 使用“define-syntax-rule”制作我自己的 while 循环

我正在尝试使用“定义语法规则”在球拍中创建自己的 while 循环。我希望它是基于程序的,所以没有辅助函数(即只使用 lambda、let、letrec 等)。

我有这个,但它给了我某种 lambda 标识符错误。

我希望它是这样我可以像普通的while循环一样使用它例如:

在循环完成后调用它会(应该)返回 10。

如何修复我的代码以执行此操作?

0 投票
1 回答
31 浏览

macros - 如何在 Scheme 宏中转置模式序列?

我编写了以下 Scheme 宏。

当我尝试

它返回以下结果。

但我的意图是编写一个宏,它返回以下结果。

如何转置模式匹配器逐项列出var变量的方式?


更新:有人告诉我,join根据 R7RS 4.3.2,这个问题中的宏是非法的:

出现在子模式中的模式变量后跟标识符 ⟨ellipsis⟩ 的一个或多个实例,仅允许出现在后跟尽可能多的 ⟨ellipsis⟩ 实例的子模板中。

0 投票
2 回答
990 浏览

c - 无法解析条件编译块内的类似函数的宏

考虑以下内容 - 我想检查#if #endif是否在代码中的某处定义了令牌。我正在使用一个CONCAT(input)宏,它应该粘合我要检查的令牌的常量和变化部分。

不幸的是,下面介绍的方法会导致编译错误:

error: missing binary operator before token "("


我找到了可以放在#if #endif块内的表达式:

https://gcc.gnu.org/onlinedocs/cpp/If.html#If

显然它指出:

宏。表达式中的所有宏都在表达式值的实际计算开始之前展开。

事实证明,(CONCAT(test))应该解决,但事实并非如此。

是否有任何解决方法允许在条件编译块中正确解析连接的令牌名称?

0 投票
1 回答
162 浏览

racket - 提供语法规则球拍

如何在球拍中提供语法规则?

我有与此类似的代码:

如何使用提供语句来提供 FROM WHERE 和星号?

这就是我提供 SELECT 的方式:

0 投票
1 回答
2589 浏览

macros - 如何将变量传递给用于访问系统verilog中路径的define宏

我正在使用定义宏来设置模块的路径,即`define DUT_PATH(CH) dut_top.u_channel_```CH``_mode

并在我们传递通道号的模块中使用这个定义宏,

模块 channel_oper # (int channel_num = 0) ( 输入逻辑 addr_base; ) ;

分配 addr_base = `DUT_PATH(channel_num).addr_base ;

端模块

在顶部文件中,我们将模块称为

通道操作(3);//channel_oper(channel_num)

我希望 addr_base 的输出为 dut_top.u_channel_3_mode.addr_base,但我得到的值分配为 dut_top.u_channel_channel_num _mode.addr_base和交叉取消引用错误。

您能否为此提供一个解决方案或任何建议,以使用定义宏的参数化变量。

在这种情况下,无法使用 genvar 或 generate 块,因为它不用于任何操作。这用于访问不同通道号的不同路径,我们从顶部模块传递通道号。模块通道操作从参数中获取通道号,然后转到该特定通道路径并获取变量。

0 投票
1 回答
78 浏览

c++ - 如何在一处注释 #ifdef 下的值

假设我们有一个 C++ 项目,它应该可以在多个平台(例如 arm/arm64)上运行,并且我们需要为每个平台设置特定于目标的值。

现在我们这样做:

我可以在哪里为可以从每个定义访问的每个已定义名称添加注释?

注意:我不能在自己的 #ifdef 中定义每个值,例如

因为我有这些值的列表和树。

谢谢你。

编辑 1:例如,我们有 6 个目标,其中 4 个支持 FEATURE,因此我们编写:

然后我有代码在某处读取此定义:

现在我想有一个地方来概括地描述这个 FEATURE 的含义和作用。

0 投票
2 回答
112 浏览

scheme - 卫生宏 r7rs:返回第二个表达式值

我目前正在学习一些 r7rs,我正在尝试实现一个宏“开始”,如下所示:

expr 是一个正则表达式(Like (set!x (+ x 1)))

begin0 作为一个宏,它计算所有表达式但只返回 expr1 结果。

例如 :

它必须返回 2018

我首先创建了一个开始函数:

现在,我试图了解如何返回 "body-expr-1" 的值?我已经完成了以下代码,但它说我遗漏了一些省略号,我不明白该怎么做。

我希望它是可以理解的,谢谢你的回答。