在Julia中,宏可以访问其参数的推断类型吗?

Jef*_*eff 6 julia

在Julia中,有没有办法编写一个基于其参数的(编译时)类型进行分支的宏,至少对于可以在编译时推断其类型的参数?就像,在下面的例子中,我code_type编写了一个名为的函数,它返回编译时类型x.有没有这样的功能,或产生这种行为的任何方式?(或者在推断出类型之前,宏会扩展,这样就不可能做到这一点.)

macro report_int(x)
  code_type(x) == Int64 ? "it's an int" : "not an int"
end
Run Code Online (Sandbox Code Playgroud)

spe*_*on2 8

宏不能这样做,但生成的函数可以.

查看文档:http://julia.readthedocs.org/en/latest/manual/metaprogramming/#generated-functions

  • 只是一个小小的迂腐:生成的函数对其参数的实际类型进行操作,而不仅仅是推断类型.(如果函数类型稳定,则两者相同). (2认同)

Sim*_*rne 6

除了 spencerlyon2 的答案之外,另一种选择是生成显式分支:

macro report_int(x)
    :(isa(x,Int64) ? "it's an int" : "not an int")
end
Run Code Online (Sandbox Code Playgroud)

如果@report_int(x)在函数内部使用,并且x可以推断出的类型,那么 JIT 将能够优化掉死分支(标准库中的@evalpoly使用这种方法)。