Syntax 为什么Julia程序员需要在宏前面加上at符号?

Syntax 为什么Julia程序员需要在宏前面加上at符号?,syntax,macros,julia,at-sign,Syntax,Macros,Julia,At Sign,每当我看到Julia宏在使用时,比如@assert或@time,我总是想知道是否需要在语法上用@前缀来区分宏。在宏中使用@时,我应该考虑什么?对我来说,它增加了噪音和分心,以一种非常好的语言(从语法上讲) 我的意思是,对我来说,“@”具有参考意义,即一个类似于域或地址的位置。在位置意义上@对宏没有意义,只是它是一个不同的编译步骤。符号总是需要在使用它们的上下文中进行解释。在不同的语境中,对符号有多种含义并不是什么新鲜事,可能永远不会消失。例如,没有人会期望C程序中的#include在Twitte

每当我看到Julia宏在使用时,比如
@assert
@time
,我总是想知道是否需要在语法上用@前缀来区分宏。在宏中使用@时,我应该考虑什么?对我来说,它增加了噪音和分心,以一种非常好的语言(从语法上讲)


我的意思是,对我来说,“@”具有参考意义,即一个类似于域或地址的位置。在位置意义上@对宏没有意义,只是它是一个不同的编译步骤。

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

条目很好地解释了在编写和/或使用宏时可能需要记住的一些事情

以下是一些片段:

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

重要的是要强调,宏作为参数接收 表达式、文字或符号

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

宏调用在解析时展开,而不是编写语法 返回结果的时间


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

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

@mymacro x
(或者在这个问题上,
@mymacro f(x)
)很可能

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

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


ASCII字符在大多数编程语言的设计中都是一种宝贵的资源,Julia也包括在内。我想选择
@
主要是因为它不需要用于更重要的事情,而且它非常突出

它实际上非常适合
@
符号本身的语义

如果我们在维基百科中查找“At symbol”,我们会发现它经常被用作介词“At”的替代词(是的,它甚至读作“At”)。介词“at”用来表示空间或时间关系

因此,我们可以使用
@
-符号作为介词at的缩写,以表示空间关系,即@tony's bar、@france等位置,指向某个内存位置@0x50FA2C(例如指针/地址),指向消息接收者(@user0851,twitter和其他论坛使用,等等)但对于时间关系,例如上午05:00、@午夜、@compile_time或@parse_time,也一样

由于宏是在解析时处理的(这里有),这与在运行时计算的其他代码完全不同(是的,其间有许多不同的阶段,但这不是重点)。 除了明确地向程序员指出以下代码片段是在解析时处理的之外!与运行时相反,我们使用@

对我来说,这种解释很符合语言


thanks@all ;)

您应该想“嘿,我会尝试
macroexpand
或阅读任何相关文档来了解这个宏扩展到什么,否则我不知道这个代码会做什么!”。这是一个明确的设计决策,为宏调用提供一种特殊的语法,以便用户意识到发生了一些不同的事情。我认为at符号的“含义”没有什么特别的,除了at符号碰巧可用之外(如果你认为这种用法令人困惑,请查看PEP 465)。谢谢,在查阅维基百科文章后,@符号作为时间介词的语义非常适合!谢谢,是的,明确区分编译阶段听起来很合理。