Types Julia中动态变量与静态变量的区分

Types Julia中动态变量与静态变量的区分,types,julia,Types,Julia,在Julia中,是否有类似于isdynamic()的函数来显示给定变量是“动态”还是“静态”类型?例如,我假设以下代码中的a和b分别是动态和静态变量,其中我所说的“动态”是指变量可以表示任何数据类型。如果我运行@code\u warntype,a和b分别显示为Any和Int64,但我想知道是否可以使用某些函数显示实际的内部表示。这是不可能的,因为内部表示的确定取决于整个函数(加上变量依赖于它时实际参数的类型),而不是调用isdynamic(a)之前的代码 好的,尝试将以下代码放入test功能体:

在Julia中,是否有类似于
isdynamic()
的函数来显示给定变量是“动态”还是“静态”类型?例如,我假设以下代码中的
a
b
分别是动态和静态变量,其中我所说的“动态”是指变量可以表示任何数据类型。如果我运行@code\u warntype,
a
b
分别显示为
Any
Int64
,但我想知道是否可以使用某些函数显示实际的内部表示。这是不可能的,因为内部表示的确定取决于整个函数(加上变量依赖于它时实际参数的类型),而不是调用
isdynamic(a)
之前的代码


好的,尝试将以下代码放入
test
功能体:

function test()
:
:
    vinfo = code_lowered(test,())[1].args[2][1]
    aind = findfirst(x->x[1]==:a,vinfo)
    bind = findfirst(x->x[1]==:b,vinfo)
    if aind > 0
        println("inference-type of a = $(vinfo[aind][2])")
    end
    if bind > 0
        println("inference-type of b = $(vinfo[bind][2])")
    end
end
然后运行
test()
。当推理机计算并在内部存储变量时,这应该显示变量之间的差异。通过查看代码修补了这一问题,因此,可能更擅长内部专家的人会有更好的答案

对于
isdynamic
功能,如所问的OP,我们可以:

function isdynamic(f,args,symbol)
    vi=code_lowered(f,args)[1].args[2][1]
    (ind=findfirst(x->x[1]==symbol,vi))>0 ? vi[ind][2]==:Any : false
end
isdynamic(test,(),:a) # true
isdynamic(test,(),:b) # false

当然,当函数已经编译时,额外的代码可以在任何地方运行(也可以从REPL运行)。非常有趣,非常感谢:)我已经玩了一段时间了。虽然获得的网络信息可能与@code_warntype相同,但我认为能够从函数中了解内部类型是很有趣的。我尝试添加一个参数,如
test(s)
,用s定义a,并从内部test()将上面的isdynamic()调用为
isdynamic(test,(typeof(s)),:a)
,然后它给出true。因此可以将检查代码“嵌入”到例程中:)您可能想要签出。
function isdynamic(f,args,symbol)
    vi=code_lowered(f,args)[1].args[2][1]
    (ind=findfirst(x->x[1]==symbol,vi))>0 ? vi[ind][2]==:Any : false
end
isdynamic(test,(),:a) # true
isdynamic(test,(),:b) # false