把事情放到上下文中:
a)在朱莉娅,人们可以通过做"foo" n次重复串repeat("foo",n).
我试图找出是否为此定义了一个"符号运算符"别名(这里更广泛地使用了"别名"),因为我怀疑可能会有,我发现它是"foo" ^ n通过检查文件在哪里repeat(::String,::Integer)定义的(types.jl); ^在下面明确定义,它基本上是一个包装器repeat.
less(^, (String,Int64))了REPL来确认,这确实把我带到了同一个文件和行. ^REPL,我会得到^ (generic function with 47 methods)b)×是一个别名cross,即调用[1.,2.,3.] × [1.,2.,3.],cross([1.,2.,3.],[1.,2.,3.])似乎是等价的,并is(×,cross)返回true.
×终端,我得到cross (generic function with 1 method); less(×,(AbstractVector,AbstractVector)),它会直接找到一个定义cross,而不是一个明确的定义×; const × = cross在sysimg.jl.问题1:是否有一种更简单的编程方式来检查函数是否定义了别名?即是否有一个相同的概念:
Run Code Online (Sandbox Code Playgroud)julia> findaliases(cross) result: [×](我试过匹配
:×到:cross使用的条件列表理解names(Base),但没有多少运气)
Q2:有没有做同样的一种编程方法
repeat(::String,::Int64)造成(^)(::AbstractString, ::Integer)的,因为在技术上它不是一个别名,但包装?,即Run Code Online (Sandbox Code Playgroud)julia> findwrappers(repeat,(String,Int64)) result: [(^,(AbstractString, Integer))]或者,一般来说,是否存在关于在何处/如何定义这些包装器的约定,这可能有助于我弄清楚它?
对于你的第一个问题,请尝试
\n\njulia> [x for x in names(Base) if eval(Base, x) === cross]\n2-element Array{Symbol,1}:\n :cross\n :\xc3\x97\nRun Code Online (Sandbox Code Playgroud)\n\n对于你的第二个问题,我不知道是否有比grepping 更好的方法。我想,有“蛮力”:
julia> [x for x in names(Base.Operators) if try eval(:(Base.Operators.$x("x", 3))) end == "xxx"]\n1-element Array{Symbol,1}:\n :^\nRun Code Online (Sandbox Code Playgroud)\n\n...我真的不推荐。但如果它有效的话...
\n