每当我看到像@assert
或@time
一样使用Julia宏时,我总是想知道需要在语法上区分宏与@前缀。使用@作为宏时我应该考虑什么?对我来说,它会增加噪音和注意力,使其语言非常好(从语法上讲)。
我的意思是,对我而言,'@'具有参考意义,即域名或地址等位置。在位置意义上,@对宏不具有意义,除了它是一个不同的编译步骤。
答案 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;)