8

Whenever I see a Julia macro in use like @assert or @time I'm always wondering about the need to distinguish a macro syntactically with the @ prefix. What should I be thinking of when using @ for a macro? For me it adds noise and distraction to an otherwise very nice language (syntactically speaking).

I mean, for me '@' has a meaning of reference, i.e. a location like a domain or address. In the location sense @ does not have a meaning for macros other than that it is a different compilation step.

4

3 回答 3

18

@应该被视为一个警告标志,表明该语言的正常规则可能不适用。例如,函数调用

f(x)

永远不会修改x调用上下文中变量的值,而是宏调用

@mymacro x

(或@mymacro f(x)就此而言)很可能。

另一个原因是 Julia 中的宏不像 C 中那样基于文本替换,而是抽象语法树中的替换(它更强大,并且避免了文本替换宏臭名昭著的意外后果)。

宏在 Julia 中具有特殊的语法,并且由于它们在解析时间之后被扩展,解析器还需要一种明确的方式来识别它们(不知道在当前范围内定义了哪些宏)。

ASCII 字符是大多数编程语言设计中的宝贵资源,Julia 就包括在内。我猜想选择@主要归结为这样一个事实,即更重要的事情不需要它,而且它非常突出。

于 2015-03-21T12:56:00.440 回答
4

符号总是需要在它们使用的上下文中进行解释。在不同语境中对符号具有多种含义并不新鲜,而且可能永远不会消失。例如,没有人应该期望#includeC 程序会在 Twitter 上传播开来。

Julia 的文档条目坚持:为什么是宏?很好地解释了您在编写和/或使用宏时可能要记住的一些事情。

以下是一些片段:

宏是必要的,因为它们在解析代码时执行,因此,宏允许程序员在整个程序运行之前生成并包含自定义代码的片段。

...

重要的是要强调宏以表达式、文字或符号的形式接收参数。

因此,如果使用表达式调用宏,它会获取整个表达式,而不仅仅是结果。

...

代替书面语法,宏调用在解析时扩展为其返回的结果。

于 2015-03-21T12:53:39.057 回答
2

@它实际上与符号本身的语义非常吻合。

如果我们在 Wikipedia 条目中查找“At symbol”,我们会发现它经常被用作介词“at”的替代品(是的,它甚至读作“at”)。介词“at”用于表达空间时间关系

因此,我们可以使用@- 符号作为介词 at 的缩写来表示空间关系,即像 @tony 的酒吧、@france 等位置到某个内存位置 @0x50FA2C(例如指针/地址) ,到消息的接收者(Twitter 和其他论坛使用的@user0851 等),但也适用于时间关系,即@05:00 am、@midnight、@compile_time 或@parse_time

而且由于宏是在解析时处理的(在这里你有它),这与在运行时评估的其他代码完全不同(是的,两者之间有许多不同的阶段,但这不是重点)。除了显式引导程序员注意以下代码片段是在解析时处理的!与运行时间相反,我们使用@。

对我来说,这个解释很适合语言。

谢谢@all ;)

于 2015-03-21T21:09:47.523 回答