当前位置: 首页 > 知识库问答 >
问题:

在Julia中,为什么@printf是宏而不是函数?

宰父夕
2023-03-14

在Julia中,打印格式化字符串的语法如下:

@printf("Hello %d\n", 5)

为什么@printf是宏而不是函数?这样它就可以接受不同数量的参数了吗?

共有1个答案

汪典
2023-03-14

对于正常的Julia函数来说,取可变数量的参数不是问题[1]。@printf是一个宏,因此它可以在编译时解析和解释格式字符串,并为该特定格式字符串生成自定义代码。人们可能没有意识到,每次调用printf时,C的printf函数都会重新解析和解释格式字符串。它这么快的事实代表了疯狂指针编程的一个小奇迹。说真的,只要看看最近的libc的printf实现就可以了。完全是疯子。

Julia使用了不同的方法:@printf是一个宏,它将格式字符串转换为特定于该格式规范的有效代码。仔细想想,printf样式的格式字符串实际上只是一种表达函数的方式,该函数接受固定数量和类型的参数,并以特定的方式打印它们。注意,我说过格式字符串是一个函数,而不是printf本身,它在概念上是一个函数生成器,将格式转换为格式化程序。事实上,在C中,所有这些都被塞进一个运行时函数中,这是一个不匹配的事实,因为这是C中唯一合理的选择。事实上,正因为如此,直到最近,向C的printf传递错误的参数数量或类型很容易搬起石头砸自己的脚。这只是现在更好,因为编译器已经被特殊的大小写来理解printf格式的语义。

理论上,Julia的@printf可以比C更快,因为它生成自定义代码,但实际上,我很难匹配C,更不用说打败它了。但我认为这是由于当前I/O系统的设计和我使用它的方式,而不是固有的限制。但是,I/O的内容应该进行彻底的改革,当这种情况发生时,我们实际上可以通过利用@printf是宏这一事实,在格式化打印方面击败C。

 类似资料:
  • 我的讲师在课堂上问过我这个问题,我想知道为什么是宏而不是函数?

  • 当我只运行预处理器时,输出文件包含20。 然而,据我所知,预处理器只是进行文本替换。所以这就是我认为正在发生的事情(这显然是错误的,但idky): NUM被定义为10 所以我认为输出应该是10而不是20。有什么能解释出哪里出了问题吗?

  • 我试图理解背后的动机。如果已经存在类型类和,为什么有必要呢? 诚然,的实例是具体的类型,而的实例需要一个类型参数。(有关有用的解释,请参见Monoid vs MonadPlus。)但是你不能重写任何类型的约束吗 作为和的组合? 从。它的实施是: 我只能使用和实现它: 有人能澄清和之间的真正区别吗?

  • 在我的问题Dart 2中。X List.cast()不组成答案需要转换

  • 问题内容: 这一直使我感到困惑。看起来这样会更好: 比这个: 是否有特定原因? 问题答案: 这是因为任何可迭代对象都可以连接(例如,列表,元组,字典,集合),但是其内容和“连接器” 必须是 字符串。 例如: 使用字符串以外的其他东西会引发以下错误:

  • rank ▲ ✰ vote url 37 511 93 416 url 为什么是string.join(list)而不是list.join(string)? 我一直被这个问题困扰.如果这样写更好: my_list = ["Hello", "world"] print my_list.join("-") # Produce: "Hello-world" 而不是: my_list = ["Hello