问题标签 [hygiene]
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.
templates - 为什么即使对于模板范围内的代码也需要脏注入?
请考虑以下几点:
这将构建并运行并产生输出:
4
但是,如果你删除{.inject.}
编译指示,你会得到:
...模板/通用实例从这里
错误:未声明的标识符:'b'
我不认为我们可以考虑echo b
模板“内部”之外的代码块,因为:它仅用于模板扩展,并且:它作为参数传递,而不是在外部使用。
我被迫使用一些肮脏的东西,现在我已经弄脏了我的全球范围来完成这项工作?
macros - datum->syntax 和 define-syntax body 中的语法 #' 有什么区别?
测试代码:
我不明白 test-d 和 test-e 的区别。在我看来,他们看起来是平等的。不过, callme 没有定义。
甚至宏步进器也说是一样的。
我猜想 intest-d
缺少一些test-e
通过stx
.
我怎样才能实现callme
仅使用 #' 来定义?
macros - 在 Scheme 中编写 myletstar 宏(卫生)
我正在尝试重新编写let*
卫生宏,我将它作为普通宏,如果可能的话,我希望将它作为卫生宏。我对这种宏类型没有太多经验。所以我真的很感激帮助。此外,我对工作let*
宏的另一种表示不起作用,与卫生宏具有相同的错误。
在职的let*
不卫生let*
->错误:lambda:不是标识符:(caar lst)
不工作let*
,但也有与第二个相同的错误。
为这个令人困惑的问题道歉,我已经被这个问题困扰了一段时间,咖啡因不再有用了。
一些测试(我选择符号名称来测试符号捕获(我知道我不必这样做)):
编辑:问题得到回答,通过编辑Lief Andersen代码添加了解决方案而不使用 let
macros - 生成嵌套模块错误的球拍宏
在尝试使用球拍的宏时,我偶然发现了一个起初对我来说并不明显的定义,为什么它被拒绝了。代码很短,否则可能没用,但如下:
投诉是quote: unbound identifier; also, no #%app syntax transformer...
如果我手动内联(define it id)
,(define it 'dummy)
那么它可以工作。我有一种预感,'
即。即使在语法上它是相同的字母序列,在子模块 mod 中也不会被识别为相同的quote
绑定(go 'dummy)
。#lang racket
如果我通过往返来去除所有词汇上下文的虚拟,如下所示:
在模式匹配(_ id)
和替换定义下方it
,(define it ok)
然后一切都很好。
我认为我的困境是由卫生系统造成的。但是,是否有更直接的解决方案可以让球拍编译器相信这些标识符,即。quote
没有这个样板真的一样吗?
lambda - 制作一个生成 lambda 的球拍宏
我正在尝试制作一个小外壳来对 csv 文件进行类似 sql 的查询(出于好奇和尝试学习 Racket)。为此,我想用这种粗略的结构实现一个选择宏(我计划让 x 成为 db 的列,但现在只传递了一行):
(其中细节是文件 IO 和管道代码)
x 的范围不是我想的那样:
然后我开始尝试像这样生成 lambda:
然后尝试模仿 let 示例的结构:
这两个在调用时都给了我同样的错误((my-lambda (+ x 1)) 0)
:
根据我的阅读,这是由于卫生问题,但我似乎无法很好地掌握它来自己解决这个问题。我做错了什么,如何定义这些宏?为什么 let 示例有效但 lambda 示例无效?
clojure - 为什么 next 不是 gensymed?
这x
是 gensymned ,因为传递给的某些表达式and
可以包含x
在其中并避免这种冲突。那为什么next
不是gensymed呢?不能next
导致变量捕获?
git - 如果 Github 中不存在自定义标签,则阻止合并
我正在为我的团队建立一个卫生开发流程。作为其中的一部分,我希望构建的每个代码都经过单元测试和 QA 验证。我已经为代码存储库创建了自定义标签,例如 QA Ready、Prod Ready。除非存在上述自定义标签,否则如何确保 PR 不会合并到 master?
rust - 如何在过程宏生成的代码中创建卫生标识符?
在编写声明式 ( macro_rules!
) 宏时,我们会自动获得宏卫生。在此示例中,我声明了一个f
在宏中命名的变量,并传入一个标识符,该标识符f
成为局部变量:
此代码可以编译,但如果您查看部分扩展的代码,您会发现存在明显的冲突:
我正在编写这个声明性宏的等效项作为过程宏,但不知道如何避免用户提供的标识符和我的宏创建的标识符之间的潜在名称冲突。据我所知,生成的代码没有卫生的概念,只是一个字符串:
src/main.rs
货运.toml
my_derive/src/lib.rs
my_derive/Cargo.toml
对于 Rust 1.40,这会产生编译器错误:
有哪些技术可以从我无法控制的标识符中命名我的标识符?
macros - 将宏变量传递给函数进行插值
我正在尝试编写一个评估表达式然后将其与一些值进行比较的宏。对于这篇文章,我已将问题简化为一个较小的示例。
因为我不想多次评估 expr,所以我想将它保存在一个变量中。所以我尝试了这个:
但是后来我val
在@small_good
.
我也尝试过传递use_val(:val)
,但这也失败了,因为宏系统将重命名
val
为其他名称。
我怎样才能做到这一点?
编辑: 给定第一个答案,我在实际代码中尝试了这个
并得到UndefVarError: ##var#253 not defined
免责声明:我知道@match
宏已经在 Match.jl 包中实现,我正在重新实现它的一个子集作为学习练习
编辑2:
我想到了。在使用了 François Févotte 的建议后,我现在不得不更改我的真实版本,use_val
而$(esc(val))
不是$val
.
我的错误是没有包括那个细节。将更新要点以反映这一点