问题标签 [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.
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:
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
模块。
当然,宏的全部目的是它们建立在其他宏之上,以避免重复代码。如果必须单独编写宏,那么在我看来,它们几乎毫无用处。
我调查了其他方案的实现,但没有更多的运气。似乎它根本无法完成。
有人可以帮我解决这个问题吗?
macros - 定义多个顶级表单的球拍宏?
我发现自己定义的语法参数除了名称之外具有相同的定义,因此我决定编写一个宏以使其更简单:
但是,不必重复宏名称,我希望能够只写:
但是我不知道如何使用普通的省略号语法来做到这一点,因为我需要将所有内容包装在 abegin
中,这将创建一个新的范围,并且我想要所有的语法参数,就好像我已经把它们写在了顶部等级。实现这一目标的正确方法是什么?
while-loop - 使用“define-syntax-rule”制作我自己的 while 循环
我正在尝试使用“定义语法规则”在球拍中创建自己的 while 循环。我希望它是基于程序的,所以没有辅助函数(即只使用 lambda、let、letrec 等)。
我有这个,但它给了我某种 lambda 标识符错误。
我希望它是这样我可以像普通的while循环一样使用它例如:
在循环完成后调用它会(应该)返回 10。
如何修复我的代码以执行此操作?
macros - 如何在 Scheme 宏中转置模式序列?
我编写了以下 Scheme 宏。
当我尝试
它返回以下结果。
但我的意图是编写一个宏,它返回以下结果。
如何转置模式匹配器逐项列出var
变量的方式?
更新:有人告诉我,join
根据 R7RS 4.3.2,这个问题中的宏是非法的:
出现在子模式中的模式变量后跟标识符 ⟨ellipsis⟩ 的一个或多个实例,仅允许出现在后跟尽可能多的 ⟨ellipsis⟩ 实例的子模板中。
c - 无法解析条件编译块内的类似函数的宏
考虑以下内容 - 我想检查#if
#endif
是否在代码中的某处定义了令牌。我正在使用一个CONCAT(input)
宏,它应该粘合我要检查的令牌的常量和变化部分。
不幸的是,下面介绍的方法会导致编译错误:
error: missing binary operator before token "("
我找到了可以放在#if
#endif
块内的表达式:
https://gcc.gnu.org/onlinedocs/cpp/If.html#If
显然它指出:
宏。表达式中的所有宏都在表达式值的实际计算开始之前展开。
事实证明,(CONCAT(test))
应该解决,但事实并非如此。
是否有任何解决方法允许在条件编译块中正确解析连接的令牌名称?
racket - 提供语法规则球拍
如何在球拍中提供语法规则?
我有与此类似的代码:
如何使用提供语句来提供 FROM WHERE 和星号?
这就是我提供 SELECT 的方式:
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 块,因为它不用于任何操作。这用于访问不同通道号的不同路径,我们从顶部模块传递通道号。模块通道操作从参数中获取通道号,然后转到该特定通道路径并获取变量。
c++ - 如何在一处注释 #ifdef 下的值
假设我们有一个 C++ 项目,它应该可以在多个平台(例如 arm/arm64)上运行,并且我们需要为每个平台设置特定于目标的值。
现在我们这样做:
我可以在哪里为可以从每个定义访问的每个已定义名称添加注释?
注意:我不能在自己的 #ifdef 中定义每个值,例如
因为我有这些值的列表和树。
谢谢你。
编辑 1:例如,我们有 6 个目标,其中 4 个支持 FEATURE,因此我们编写:
然后我有代码在某处读取此定义:
现在我想有一个地方来概括地描述这个 FEATURE 的含义和作用。
scheme - 卫生宏 r7rs:返回第二个表达式值
我目前正在学习一些 r7rs,我正在尝试实现一个宏“开始”,如下所示:
expr 是一个正则表达式(Like (set!x (+ x 1)))
begin0 作为一个宏,它计算所有表达式但只返回 expr1 结果。
例如 :
它必须返回 2018
我首先创建了一个开始函数:
现在,我试图了解如何返回 "body-expr-1" 的值?我已经完成了以下代码,但它说我遗漏了一些省略号,我不明白该怎么做。
我希望它是可以理解的,谢谢你的回答。