2014-10-06 11 views
8

Ben bir işlevi ilan edip şöyle fonksiyonun gövdesini görmek mümkün duyuyorum:Julia: fonksiyonunun gösterisi gövdesi (kayıp kodunu bulmak için) R-dilinde

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

da böyle bir şey var mı Julia'da mümkün mü? Çok kullanışlı bir işlev yazdım ve hala bellekte/satırda kaldım ama nasıl yazdığımı unuttum. Julia’da böyle bir metodun var olduğunu umuyorum, böylece nasıl yazdığımı öğrenebilirim.

+0

Sadece işlevin adını Julia yorumlayıcısına yazarsanız ne yaparsınız? –

+0

'' '(1 yöntemle genel işlev)' '' – cantdutchthis

cevap

8

Bir pakette tanımlanan işlevler için less veya @less'u kullanabilirsiniz. Birincisi, bir işlev adı alır (ve ilk tanımını döndürür, istediğinizi olmayan ), ikincisi, bir işlev çağrısı.

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

Ancak bu, REPL'de tanımladığınız işlevlerle çalışmaz. Bunlar için code_typed'u kullanabilirsiniz, ancak kodunuzun yalnızca daha az okunabilir olan AST (özet sözdizimi ağacı) değerini döndürür. Ayrıca, argümanlarının türünü de sağlamanız gerekir, çünkü aynı ada sahip birkaç işlev olabilir: 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' (aynı yoldan çağrılır), 'code_typed'' den daha orijinal kodlara daha yakın olabilir, ancak ne yazık ki her ikisi de bundan çok uzakta olacak ve Gerçekten de koşabileceğin bir şey (en azından hile olmadan). – simonster