问题标签 [gensym]

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 回答
511 浏览

macros - 为什么这个 Lisp 宏作为一个整体工作,即使每个部分都不起作用?

我正在阅读/使用 Practical Common Lisp。我正在讨论关于在 Lisp 中构建测试框架的章节。

我有如下实现的功能“test-+”,它可以工作:

请记住,我说过,它有效,这就是为什么接下来的事情如此令人困惑......

这是“test-+”所指的一些代码:

现在,我一直在做的是使用 Slime 一步一步地对它们进行宏扩展(使用 ctrl-c RET,它映射到 macroexpand-1)。

因此,“test-+”的“检查”调用扩展为:

然后宏扩展为:

这是代码,就在这句话的正上方,它不起作用。如果我将它粘贴到 REPL 中,我会收到以下错误(我使用的是 Clozure Common Lisp):

未绑定变量:#:G2867 [UNBOUND-VARIABLE 类型的条件]

现在,如果我采用相同的代码,将 gensym 替换为变量名,例如“x”,它就可以正常工作。

那么,我们如何解释以下惊喜:

  1. 调用所有这些的“test-+”宏工作正常。

  2. “combine-results”宏的宏扩展运行。

  3. 如果我从“组合结果”的宏扩展中删除 gensym,它 确实有效。

我唯一可以推测的是,您不能使用包含 gensyms 文字用法的代码。如果是这样,为什么不呢?如何解决这个问题?如果这不是解释,那是什么?

谢谢。

0 投票
3 回答
1711 浏览

clojure - 在 Clojure 的嵌套语法引号中协调自动生成符号

在 Clojure 中,您需要gensym在宏中创建供内部使用的符号,以保持它们的卫生。但是,有时您需要在嵌套语法引号中使用相同的符号。例如,如果我想将一个值绑定到一个符号,let并在展开的循环中打印三次,我会这样做

但这会产生

x#let在表单中生成与嵌套在其中的表单不同的符号println- 因为它们是从不同的语法引号创建的。

为了解决它,我可以预先生成符号并将其注入到语法引号中:

这将产生正确的结果,在任何地方都需要相同的符号:

现在,虽然它确实产生了正确的结果,但代码本身看起来既丑陋又冗长。我不喜欢必须“声明”一个符号,并且注入语法使它看起来像是来自宏外部,或者在其中某处计算。我希望能够使用 auto-gensym 语法,这清楚地表明这些是宏内部符号。

那么,有没有办法使用带有嵌套语法引号的 auto-gensym 并使它们产生相同的符号?

0 投票
2 回答
1103 浏览

lisp - 非驻留符号symbol

关于Common lisp,我有些不明白。

假设我正在编写一个类似的宏:

比我能做的

现在我想看看它是如何扩展的

行。gensym 生成了一些独特的符号,这些符号被打印为 uninterned。

据我所知,uninterned 符号是评估器不会在内部创建符号数据绑定的符号。

因此,如果我们将宏扩展为该表单,则 (incf #:G4315) 上应该会出现错误。为了测试这一点,我们可以在 REPL 中评估该表单:

那么为什么扩展为这个字符串的宏可以完美地工作而表单本身却不能呢?

0 投票
2 回答
131 浏览

macros - 如何在 clojure 中编写此宏?

我有这个功能:

但我一直在更改页面列表-which-resolve-to-functions-with-the-same-name,我希望能够写:

(def-handler 善恶中立)

反而:

但我被困住了。到目前为止,我最好的镜头如下:

但它不太有效,因为生成的调用中的请求不是 gensym,我不知道如何在其中获取 gensym。

这看起来很有希望,直到我注意到它产生了一个新的 gensym:

0 投票
2 回答
999 浏览

testing - 如何测试使用 gensyms 的 clojure 宏?

我想测试一个使用 gensyms 的宏。例如,如果我想测试这个:

我可以使用宏扩展...

...要得到...

这对一个人来说很容易验证是否正确。

但是我怎样才能以一种实用、干净的自动化方式对此进行测试呢?gensym 不稳定。

(是的,我知道特定的宏观示例并不引人注目,但这个问题仍然是公平的。)

我意识到 Clojure 表达式可以被视为数据(它是一种同音语言),所以我可以像这样分解结果:

但这很笨拙。有没有更好的方法?也许有可以派上用场的数据结构“验证”库?也许解构会让这更容易?逻辑编程?

更新/评论

虽然我很欣赏有经验的人说“不要测试宏扩展本身”的建议,但它并没有直接回答我的问题。

通过测试宏扩展来“单元测试”宏有什么不好?测试扩展是合理的——事实上,许多人在 REPL 中“手动”测试他们的宏——那么为什么不自动测试呢?我认为没有充分的理由不这样做。我承认测试宏扩展比测试结果更脆弱,但做前者仍然有价值。你也可以测试功能——你可以两者都做!这不是一个非此即彼的决定。

这是我的心理解释。人们不测试宏扩展的原因之一是它目前有点痛苦。一般而言,人们往往会在看似困难的情况下合理地反对做某事,而与它的内在价值无关。是的——这正是我问这个问题的原因!如果这很容易,我认为人们会更频繁地这样做。如果这很容易,他们就不太可能通过给出“不值得做”的答案来合理化。

我也理解“您不应该编写复杂的宏”的论点。当然。但我们希望人们不要去想“如果我们鼓励一种不测试宏的文化,那么这将阻止人们编写复杂的宏”。这样的论点是愚蠢的。如果您有一个复杂的宏扩展,那么测试它是否按预期工作是一件明智的事情。即使是简单的事情,我个人也不会接受测试,因为我经常对错误可能来自简单的错误感到惊讶。

0 投票
1 回答
149 浏览

clojure - 如何将 gensym 应用于每个特定变量

我想编写一个宏(my-dotimes [x init end] & body),计算从 init 到 end-1 以 1 为增量的 x 的 body 值。在这里,您必须再次确保避免使用“变量”捕获问题”。它应该像这样工作:

我的代码是:

但是当我使用macroexpand检查它并找到:

我想知道如何改变

0 投票
1 回答
937 浏览

python - 如何将对话数据分成多对(上下文,响应)

我正在使用 Gensim Doc2Vec 模型,试图对客户支持对话的部分进行聚类。我的目标是为支持团队提供自动回复建议。

图 1:显示了一个示例对话,其中用户问题在下一个对话行中得到回答,从而可以轻松提取数据:

图1

在谈话中应该建议“你好”“我们的办公室位于纽约市”


图 2:描述了问题和答案不同步的对话

图 2

在谈话中应该建议“你好”“我们的办公室位于纽约市”


图 3:描述了一个对话,其中答案的上下文是随着时间的推移而建立的,出于分类目的(我假设),有些行是多余的。

图 3

在对话期间应建议“这里是免费试用帐户的链接”


每个对话行(简化)都有以下数据:
谁编写了该行(用户或代理)、文本、时间戳

我正在使用以下代码来训练我的模型:

:我应该如何构建我的训练数据以及可以应用哪些启发式方法从原始数据中提取它?

0 投票
1 回答
58 浏览

clojure - 为什么 next 不是 gensymed?

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

0 投票
4 回答
1440 浏览

lisp - gensym 在 Lisp 中做了什么?

上下文化:我一直在做一个大学项目,我必须为正则表达式编写一个解析器并构建相应的 epsilon-NFA。我必须在 Prolog 和 Lisp 中这样做。我不知道这样的问题是否允许,如果不允许,我道歉。

我听到我的一些同学谈论他们如何使用功能 gensym ,我问他们它做了什么,甚至在网上查了一下,但我真的不明白这个功能做什么,为什么或者什么时候最好使用它

特别是,我对它在 Lisp 中的作用更感兴趣。谢谢你们。

0 投票
0 回答
10 浏览

gensym - 来自 C# 的 G2 Gensym 帖子

我正在尝试将消息传递到系统 G2,但出现错误,方法“PostMessage”没有重载需要 2 个参数。你能帮忙吗,谢谢