为什么Julia程序员需要使用at符号为宏添加前缀?

时间:2015-03-21 12:00:10

标签: syntax macros julia at-sign

每当我看到像@assert@time一样使用Julia宏时,我总是想知道需要在语法上区分宏与@前缀。使用@作为宏时我应该考虑什么?对我来说,它会增加噪音和注意力,使其语言非常好(从语法上讲)。

我的意思是,对我而言,'@'具有参考意义,即域名或地址等位置。在位置意义上,@对宏不具有意义,除了它是一个不同的编译步骤。

3 个答案:

答案 0 :(得分:15)

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

f(x)

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

@mymacro x

(或@mymacro f(x))非常好。

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

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

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

答案 1 :(得分:2)

符号始终需要在使用它们的上下文中进行解释。在不同情境中,符号具有多种含义并不是新的,并且可能永远不会消失。例如,没有人希望C程序中的#include在Twitter上传播。

Julia's Manual条目Hold up: why macros?很好地解释了在编写和/或使用宏时您可能会记住的一些事项。

以下是几个片段:

  

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

...

  

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

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

...

  

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

答案 2 :(得分:1)

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

如果我们在维基百科条目中查找符号'我们发现它经常被用作介词的替代品。 (是的,它甚至可以读到' at')。介词' at'用于表示空间时间关系

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

因为宏在解析时处理 (这里你有),这与在运行时评估的其他代码完全不同(是的,它们之间有许多不同的阶段,但是& #39;这不是重点。 除了明确地将注意力引向程序员之外,在解析时处理以下代码片段!因为反对运行时间,我们使用@。

对我而言,这种解释非常符合语言。

感谢@ all;)