2014-10-06 2 views
8

В R-языке, который я могу объявить функцию и увидеть тело функции следующим образом:Julia: показать тело функции (найти потерянный код)

> megafoobar = function(x){ return(x + 10000)} 
> body(megafoobar) 
{ 
    return(x + 10000) 
} 

Это что-то вроде этого также возможно в Джулии? Я написал функцию, которая была очень полезной, и она все еще находится в памяти/вызываемом, но я забыл, как я ее написал. Я надеюсь, что такой метод существует в Джулии, поэтому я могу узнать, как я это написал.

+0

Что вы можете получить, если просто введите имя функции в интерпретатор Джулии? –

+0

'' '(общая функция с 1 методом)' '' – cantdutchthis

ответ

8

Для функций, определенных в пакете, вы можете использовать less или @less. Первый, принимает имя функции (и возвращает первое определение, , которое не обязательно должно быть тем, кого вы хотите), последним, вызовом функции.

less(less)   # First definition of less, 
        # with signature (String,Integer) 
@less less(less) # Definition of less(f::Callable) 

Но это не будет работать с функциями, которые вы определили сами в 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)))) 
+2

'code_lowered' (называется так же) может быть ближе к исходному коду, чем' code_typed', но, к сожалению, оба будут довольно далеки от него, и ни один из них не даст вы что-то можете запустить (по крайней мере, не без большого обмана). – simonster

Смежные вопросы