为什么 Julia 程序员需要在宏前面加上 at 符号?
Why do Julia programmers need to prefix macros with the at-sign?
每当我看到像 @assert
或 @time
这样的 Julia 宏在使用时,我总是想知道是否需要在语法上用 @ 前缀来区分宏。将 @ 用于宏时我应该考虑什么?对我来说,它给一门非常好的语言(从句法上讲)增加了噪音和干扰。
我的意思是,对我而言,“@”具有参考意义,即像域或地址这样的位置。在位置意义上,除了它是一个不同的编译步骤之外,@ 对宏没有任何意义。
符号总是需要在它们使用的上下文中进行解释。符号在不同语境下具有多重含义并不新鲜,而且可能永远不会消失。例如,没有人应该期望 C 程序中的 #include
会在 Twitter 上传播开来。
Julia's Documentation entry Hold up: why macros? 很好地解释了您在使用宏编写 and/or 时可能要记住的一些事情。
以下是一些片段:
Macros are necessary because they execute when code is parsed,
therefore, macros allow the programmer to generate and include
fragments of customized code before the full program is run.
...
It is important to emphasize that macros receive their arguments as
expressions, literals, or symbols.
因此,如果用表达式调用宏,它会得到整个表达式,而不仅仅是结果。
...
In place of the written syntax, the macro call is expanded at parse
time to its returned result.
@
应被视为一个警告标志,表明该语言的正常规则可能不适用。例如,函数调用
f(x)
永远不会在调用上下文中修改变量x
的值,但是宏调用
@mymacro x
(或 @mymacro f(x)
就此而言)很有可能。
另一个原因是 Julia 中的宏不像 C 中那样基于文本替换,而是基于抽象语法树中的替换(这更强大并且避免了文本替换宏臭名昭著的意外后果)。
宏在 Julia 中有特殊的语法,并且由于它们在解析时间后展开,解析器也需要一种明确的方式来识别它们
(不知道当前范围内定义了哪些宏)。
ASCII 字符是大多数编程语言设计中的宝贵资源,Julia 就包含其中。我猜想 @
的选择主要归结为这样一个事实,即更重要的事情不需要它,而且它非常突出。
它实际上非常符合 @
符号本身的语义。
如果我们查找 'At symbol' 的维基百科条目,我们会发现它经常被用作介词 'at' 的替代(是的,它甚至读作 'at')。而介词'at'用来表示空间或时间关系.
因此,我们可以使用 @
符号作为介词 at 的缩写来指代空间关系,即像@tony's bar、@france 等这样的位置,指向一些记忆位置@0x50FA2C(例如 pointers/addresses),到消息的接收者(@user0851 which twitter 和其他论坛使用等),但也适用于时间关系,即@05:00 am,@midnight, @compile_time 或 @parse_time.
并且由于宏是在 解析时 处理的(这里有),这与在 运行 时评估的其他代码完全不同(是的中间有许多不同的阶段,但这不是重点)。
除了明确指示程序员注意以下代码片段是在解析时处理的!与 运行 时间相反,我们使用 @.
对我来说,这个解释非常适合该语言。
谢谢@all ;)
每当我看到像 @assert
或 @time
这样的 Julia 宏在使用时,我总是想知道是否需要在语法上用 @ 前缀来区分宏。将 @ 用于宏时我应该考虑什么?对我来说,它给一门非常好的语言(从句法上讲)增加了噪音和干扰。
我的意思是,对我而言,“@”具有参考意义,即像域或地址这样的位置。在位置意义上,除了它是一个不同的编译步骤之外,@ 对宏没有任何意义。
符号总是需要在它们使用的上下文中进行解释。符号在不同语境下具有多重含义并不新鲜,而且可能永远不会消失。例如,没有人应该期望 C 程序中的 #include
会在 Twitter 上传播开来。
Julia's Documentation entry Hold up: why macros? 很好地解释了您在使用宏编写 and/or 时可能要记住的一些事情。
以下是一些片段:
Macros are necessary because they execute when code is parsed, therefore, macros allow the programmer to generate and include fragments of customized code before the full program is run.
...
It is important to emphasize that macros receive their arguments as expressions, literals, or symbols.
因此,如果用表达式调用宏,它会得到整个表达式,而不仅仅是结果。
...
In place of the written syntax, the macro call is expanded at parse time to its returned result.
@
应被视为一个警告标志,表明该语言的正常规则可能不适用。例如,函数调用
f(x)
永远不会在调用上下文中修改变量x
的值,但是宏调用
@mymacro x
(或 @mymacro f(x)
就此而言)很有可能。
另一个原因是 Julia 中的宏不像 C 中那样基于文本替换,而是基于抽象语法树中的替换(这更强大并且避免了文本替换宏臭名昭著的意外后果)。
宏在 Julia 中有特殊的语法,并且由于它们在解析时间后展开,解析器也需要一种明确的方式来识别它们 (不知道当前范围内定义了哪些宏)。
ASCII 字符是大多数编程语言设计中的宝贵资源,Julia 就包含其中。我猜想 @
的选择主要归结为这样一个事实,即更重要的事情不需要它,而且它非常突出。
它实际上非常符合 @
符号本身的语义。
如果我们查找 'At symbol' 的维基百科条目,我们会发现它经常被用作介词 'at' 的替代(是的,它甚至读作 'at')。而介词'at'用来表示空间或时间关系.
因此,我们可以使用 @
符号作为介词 at 的缩写来指代空间关系,即像@tony's bar、@france 等这样的位置,指向一些记忆位置@0x50FA2C(例如 pointers/addresses),到消息的接收者(@user0851 which twitter 和其他论坛使用等),但也适用于时间关系,即@05:00 am,@midnight, @compile_time 或 @parse_time.
并且由于宏是在 解析时 处理的(这里有),这与在 运行 时评估的其他代码完全不同(是的中间有许多不同的阶段,但这不是重点)。 除了明确指示程序员注意以下代码片段是在解析时处理的!与 运行 时间相反,我们使用 @.
对我来说,这个解释非常适合该语言。
谢谢@all ;)