问题标签 [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.

0 投票
2 回答
183 浏览

templates - 为什么即使对于模板范围内的代码也需要脏注入?

请考虑以下几点:

这将构建并运行并产生输出:

4

但是,如果你删除{.inject.}编译指示,你会得到:

...模板/通用实例从这里
错误:未声明的标识符:'b'

我不认为我们可以考虑echo b模板“内部”之外的代码块,因为:它仅用于模板扩展,并且:它作为参数传递,而不是在外部使用。

我被迫使用一些肮脏的东西,现在我已经弄脏了我的全球范围来完成这项工作?

0 投票
1 回答
517 浏览

macros - datum->syntax 和 define-syntax body 中的语法 #' 有什么区别?

测试代码:

我不明白 test-d 和 test-e 的区别。在我看来,他们看起来是平等的。不过, callme 没有定义。

甚至宏步进器也说是一样的。

我猜想 intest-d缺少一些test-e通过stx.

我怎样才能实现callme仅使用 #' 来定义?

0 投票
3 回答
111 浏览

macros - 在 Scheme 中编写 myletstar 宏(卫生)

我正在尝试重新编写let*卫生宏,我将它作为普通宏,如果可能的话,我希望将它作为卫生宏。我对这种宏类型没有太多经验。所以我真的很感激帮助。此外,我对工作let*宏的另一种表示不起作用,与卫生宏具有相同的错误。

在职的let*

不卫生let*->错误:lambda:不是标识符:(caar lst)

不工作let*,但也有与第二个相同的错误。

为这个令人困惑的问题道歉,我已经被这个问题困扰了一段时间,咖啡因不再有用了。

一些测试(我选择符号名称来测试符号捕获(我知道我不必这样做)):

编辑:问题得到回答,通过编辑Lief Andersen代码添加了解决方案而不使用 let

0 投票
1 回答
105 浏览

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没有这个样板真的一样吗?

0 投票
2 回答
295 浏览

lambda - 制作一个生成 lambda 的球拍宏

我正在尝试制作一个小外壳来对 csv 文件进行类似 sql 的查询(出于好奇和尝试学习 Racket)。为此,我想用这种粗略的结构实现一个选择宏(我计划让 x 成为 db 的列,但现在只传递了一行):

(其中细节是文件 IO 和管道代码)

x 的范围不是我想的那样:

我发现了一个 let-like 宏的示例

然后我开始尝试像这样生成 lambda:

然后尝试模仿 let 示例的结构:

这两个在调用时都给了我同样的错误((my-lambda (+ x 1)) 0)

根据我的阅读,这是由于卫生问题,但我似乎无法很好地掌握它来自己解决这个问题。我做错了什么,如何定义这些宏?为什么 let 示例有效但 lambda 示例无效?

0 投票
1 回答
58 浏览

clojure - 为什么 next 不是 gensymed?

x是 gensymned ,因为传递给的某些表达式and可以包含x在其中并避免这种冲突。那为什么next不是gensymed呢?不能next导致变量捕获?

0 投票
1 回答
785 浏览

git - 如果 Github 中不存在自定义标签,则阻止合并

我正在为我的团队建立一个卫生开发流程。作为其中的一部分,我希望构建的每个代码都经过单元测试和 QA 验证。我已经为代码存储库创建了自定义标签,例如 QA Ready、Prod Ready。除非存在上述自定义标签,否则如何确保 PR 不会合并到 master?

0 投票
2 回答
2211 浏览

rust - 如何在过程宏生成的代码中创建卫生标识符?

在编写声明式 ( macro_rules!) 宏时,我们会自动获得宏卫生。在此示例中,我声明了一个f在宏中命名的变量,并传入一个标识符,该标识符f成为局部变量:

此代码可以编译,但如果您查看部分扩展的代码,您会发现存在明显的冲突:

我正在编写这个声明性宏的等效项作为过程宏,但不知道如何避免用户提供的标识符和我的宏创建的标识符之间的潜在名称冲突。据我所知,生成的代码没有卫生的概念,只是一个字符串:

src/main.rs

货运.toml

my_derive/src/lib.rs

my_derive/Cargo.toml

对于 Rust 1.40,这会产生编译器错误:

有哪些技术可以从我无法控制的标识符中命名我的标识符?

0 投票
1 回答
61 浏览

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.

我的错误是没有包括那个细节。将更新要点以反映这一点

0 投票
1 回答
73 浏览

api - 如何从 Zomato 中提取卫生等级?

我正在开展一个项目,我希望分析德里 Zomato 上列出的餐厅的卫生等级。我能够使用 Zomato /search API 获取餐厅详细信息,但该 API 不提供餐厅的卫生等级。

我尝试抓取,但我不断收到错误消息。

网页抓取代码:

我不断收到以下错误:

有没有其他方法可以从 Zomato 中提取餐厅的卫生等级?

在此处输入图像描述