朱莉娅:显示功能体(寻找丢失的代码)

can*_*his 9 r function julia

在R语言中,我能够声明一个函数并查看函数的主体,如下所示:

> megafoobar = function(x){ return(x + 10000 )}
> body(megafoobar)
{
    return(x + 10000)
}
Run Code Online (Sandbox Code Playgroud)

朱莉娅也有可能这样吗?我写了一个非常有用的函数,它仍然在内存/可调用,但我忘了我是如何编写的.我希望朱莉娅有这样的方法,所以我可以找到我是如何写的.

Vin*_*ynd 8

对于包中定义的函数,您可以使用less@less.前者采用函数名称(并返回第一个定义,不一定是你想要的定义),后者是一个函数调用.

less(less)         # First definition of less, 
                   # with signature (String,Integer)
@less less(less)   # Definition of less(f::Callable)
Run Code Online (Sandbox Code Playgroud)

但这不适用于您在REPL中定义的函数.对于那些,你可以使用code_typed,但它只返回你的代码的AST(抽象语法树),它的可读性较差.您还需要提供参数的类型,因为可以有多个具有相同名称的函数:您可以使用它们methods.

f(x::Number) = x + 1
f(x::AbstractArray) = length(x)

methods(f)
# 2 methods for generic function "f":
# f(x::Number) at none:1
# f(x::AbstractArray{T,N}) at none:1

code_typed(f,(Number,))  # Give the argument types as a tuple
# 1-element Array{Any,1}:
#  :($(Expr(:lambda, {:x}, {{},{{:x,Number,0}},{}}, :(begin  # none, line 1:
#         return x::Number + 1
#     end))))
Run Code Online (Sandbox Code Playgroud)

  • `code_lowered`(以相同的方式调用)可能比`code_typed'更接近原始代码,但不幸的是两者都离它很远,也不会给你一些你可以实际运行的东西(至少没有大量的诡计). (2认同)