如何在朱莉娅中找到现有的功能"别名"?

Tas*_*nou 5 alias julia

把事情放到上下文中:

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,而不是一个明确的定义×;
  • 有点"grepping"后,我发现定义const × = crosssysimg.jl.

问题1:是否有一种更简单的编程方式来检查函数是否定义了别名?即是否有一个相同的概念:

julia> findaliases(cross)
  result: [×]
Run Code Online (Sandbox Code Playgroud)

(我试过匹配:cross使用的条件列表理解names(Base),但没有多少运气)

Q2:有没有做同样的一种编程方法repeat(::String,::Int64)造成(^)(::AbstractString, ::Integer)的,因为在技术上它不是一个别名,但包装?,即

julia> findwrappers(repeat,(String,Int64))
  result: [(^,(AbstractString, Integer))]
Run Code Online (Sandbox Code Playgroud)

或者,一般来说,是否存在关于在何处/如何定义这些包装器的约定,这可能有助于我弄清楚它?

Fen*_*ang 3

对于你的第一个问题,请尝试

\n\n
julia> [x for x in names(Base) if eval(Base, x) === cross]\n2-element Array{Symbol,1}:\n :cross\n :\xc3\x97\n
Run Code Online (Sandbox Code Playgroud)\n\n

对于你的第二个问题,我不知道是否有比grepping 更好的方法。我想,有“蛮力”:

\n\n
julia> [x for x in names(Base.Operators) if try eval(:(Base.Operators.$x("x", 3))) end == "xxx"]\n1-element Array{Symbol,1}:\n :^\n
Run Code Online (Sandbox Code Playgroud)\n\n

...我真的不推荐。但如果它有效的话...

\n

  • 讽刺的是,我还刚刚意识到 `?cross` 会提到所有别名(大概这是约定),而 `?^` 提到 `repeat` 是字符串的“别名”(不是反过来吗?) 。话虽如此,“?repeat”在其文档字符串中没有提及字符串或“^”……也许我应该报告这一点? (4认同)