在Julia中,打印格式化字符串的语法如下:
@printf("Hello %d\n", 5)
为什么@printf
是宏而不是函数?这样它就可以接受不同数量的参数了吗?
对于正常的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()不组成答案需要转换
这是一个示例运行: 根据需要输入任意数量的整数。输入 0 停止。 返回 输入的负整数数。 正整数输入的数量。 总和。 意味 着。输入整数:8 输入整数:6 输入整数:20 输入整数: -2 输入整数:0 正数为:3 负数为:1 总数为:32 平均值为:8$00 我的问题就在底部:当我为中间没有特殊字符的浮点数指定%.2f时,是8$00。arg mean的期望输出是“8.00”。我把所有的代码都贴了
问题内容: 这一直使我感到困惑。看起来这样会更好: 比这个: 是否有特定原因? 问题答案: 这是因为任何可迭代对象都可以连接(例如,列表,元组,字典,集合),但是其内容和“连接器” 必须是 字符串。 例如: 使用字符串以外的其他东西会引发以下错误: