问题标签 [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 - 使用宏在 Scheme 中对函数进行柯里化
我正在学习 Scheme 中的宏系统,我认为实现 curried 函数将是一个好的开始。这是我做的:
此代码按预期工作。例如我可以定义一个add
函数如下:
然后我可以正常调用它:
此外,我可以轻松地部分应用它:
现在我正在考虑允许对带有剩余参数的函数进行柯里化。所以我添加了一个新的语法规则:
不幸的是,当我尝试使用此规则创建函数时,它给了我一个错误:
这是错误消息:
我究竟做错了什么?
list - 如何在球拍中创建一个宏,其中列表成为所述 lambda 的参数?
我将如何做一个define-syntax-rule
接受一个列表作为参数和一个列表(或引用,如果它是一个元素)作为 lambda 的主体?我想做类似的事情:
我玩过define-syntax-rule
and apply
,但由于lambda
它本身似乎是一个宏而不是一个过程,我一直很难找到它......
哦...我想要一个不使用的解决方案eval
,因为它是有害的...
更新
谢谢你的回答,瑞恩......几乎做到了!=) eval 的问题在于它不擅长捕捉当前范围......这样我可以做类似的事情
eval 会惨遭失败……这只是一个学术例子,但我认为这是对正确性的一个很好的测试。
macros - 有没有办法在 Racket 或任何其他方案中定义编译时(扩展时)宏变量?
举一个简单的例子:
这样给出:
以下都应评估为#t
:
是否有任何真正的球拍功能可以define-macro-variable
完成上面示例中应该做的事情?
编辑:
我找到了解决方法:
但我更喜欢不需要所有使用宏变量的宏都在一个表达式中的解决方案。
macros - 在 Scheme 中捕获宏
define-syntax
使用或define-syntax-rule
在 Racket中定义捕获宏的最简单方法是什么?
作为一个具体的例子,这里是aif
一个 CL 风格的宏系统中的琐碎。
这个想法是it
绑定到test
andif-true
子句if-false
的结果。天真的音译(减去可选替代项)是
it
如果您尝试在子句中使用,它会毫无怨言地进行评估,但会出错:
anaphora
鸡蛋实现aif
为_
但球拍似乎没有ir-macro-transformer
定义或记录。
objective-c - 如何在目标C中使用#define变量作为方法参数
我对 Objective-C 很陌生,我想做的是在EntityNameConstants.h
存储所有实体名称的文件中定义变量。
对于与 ManagedObjectContext 相关的所有方法,我将使用存储库中的所有定义。
例如。这是在 .h 文件中
在存储库中我想使用这个常量如下
但我不能这样做,它给了我解析问题错误。
我在这里做错什么了吗?
for-loop - 在 Scheme 中定义一个 For 循环
注意:这似乎是 Gauche Scheme 版本 0.9.3.3。
我似乎无法理解这些 Lisp 语言:/。
我正在尝试在 Scheme 中定义一个 for 循环语法。我不确定这是否可以通过递归函数实现(我认为可以),但此时我真的很想开始define-syntax
工作。
我可以使用以下代码让循环运行一次(然后看起来它终止了):
也可以用省略号定义它会很好,但这会给出“模板包含常量形式的重复”。我已经阅读了 R5RS 规范的宏部分,不过我很快会重新阅读模板部分:
我首先尝试了这个,但它运行了大约 10 秒,然后没有任何输出就失败了......我正在使用compileonline.com,所以这可能与它有关:
如果我从不调用 forloop 就没有问题(我认为这是因为它永远不必扩展宏),所以我用来测试这些的代码是:
我究竟做错了什么?我已经成功地实现了一个when
声明(我自己,但那里有几十个例子,我已经看过很多)。我认为我想做的事情的递归性质和省略号把我搞砸了。
macros - 编写一个'define-let'宏,卫生
我正在尝试define-let
在球拍中编写一个宏,它“保存” a 的标题(let ((var value) ...) ...)
,即只是(var value) ...
部分,并允许稍后重新使用它。
下面的代码按预期工作:
问题是宏破坏了卫生:如下例所示,y
在 a 中声明的define-let
由宏产生的变量 应该是一个新的、不受约束的符号,因为卫生,但它设法从宏中泄漏, 并且在(displayln y)
.
我如何编写define-let
宏,使其表现得像第一个示例中一样,但在标识符由宏生成时也保持卫生,"okay"
在第二个示例中给出?
macros - 如何控制 Scheme 宏扩展的顺序?
我正在使用 Racket 宏扩展syntax-id-rules
,它是其他一些方案实现在名称下提供的identifier-syntax
。这些使您可以指定即使定义的标识符不在头部位置也会发生的宏扩展。例如:
将标识符设置proxy
为hidden
. 这是一个无用的示例,但它说明了用法。
我发现自己处于想要一个全局普通宏的情况,我们称之为foo
,在某些情况下我想覆盖我使用标识符宏之类的proxy
. 也就是说,我希望能够做这样的事情:
但实际上最后一行返回'default
,因为foo
宏在它之前被扩展proxy
。
任何想法我可以如何实现这些方面的东西,但proxy
标识符宏覆盖默认宏定义foo
?我并没有专门致力于上述架构。
补充:这不适用于任何现实世界的使用,而是形式语义理论点演示的一部分。
scheme - 扩展宏时是否可以使用用户定义的功能?
来自鸡肉计划手册:
定义语法在不同的扩展环境中评估过程(最初可以访问方案模块的导出标识符)
是否可以将用户功能注入扩展环境?
scheme - 定义语法参数和用法
我不太了解 Scheme 中定义语法的论点和用法。对于它的价值,我正在使用 Petite Chez Cheme。我查看了一些来源:
http://docs.racket-lang.org/guide/pattern-macros.html
但是,他们没有给我我正在寻找的理解。我正在寻找对应用新语法时发生的情况的明确解释。我对在定义语法时使用省略号(“...”)特别好奇。