2014-10-06 10 views
8

Trong R-ngôn ngữ tôi có thể tuyên bố một chức năng và để xem các cơ quan chức năng như vậy:Julia: hiển thị cơ thể của chức năng (để tìm mã bị mất)

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

là một cái gì đó như thế này cũng có thể ở Julia? Tôi đã viết một chức năng rất hữu ích và nó vẫn còn trong bộ nhớ/có thể gọi được nhưng tôi quên mất cách tôi đã viết nó. Tôi hy vọng một phương pháp như vậy tồn tại ở Julia để tôi có thể tìm ra cách tôi đã viết nó.

+0

bạn sẽ nhận được gì nếu bạn chỉ nhập tên của hàm vào trình thông dịch Julia? –

+0

'' '(hàm chung với 1 phương thức)' '' – cantdutchthis

Trả lời

8

Đối với các chức năng được xác định trong gói, bạn có thể sử dụng less hoặc @less. Tên cũ, lấy tên hàm (và trả về định nghĩa đầu tiên, mà không cần phải là cái bạn muốn), sau này, một hàm gọi.

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

Nhưng điều này sẽ không hoạt động với các hàm bạn đã tự xác định trong REPL. Đối với những người, bạn có thể sử dụng code_typed, nhưng nó chỉ trả về AST (trừu tượng cây cú pháp) của mã của bạn, ít dễ đọc hơn. Bạn cũng cần phải cung cấp loại đối số, vì có thể có một số chức năng có cùng tên: bạn có thể nhận chúng bằng 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' (gọi cùng một cách) có thể gần mã gốc hơn' code_typed', nhưng không may cả hai sẽ khá xa và không cho bạn một cái gì đó bạn thực sự có thể chạy (ít nhất là không phải không có rất nhiều trickery). – simonster

Các vấn đề liên quan