如何访问函数体?
上下文:我在模块中有函数,我用特定的参数值执行。我想“记录”这些参数值和相应的功能形式。在我的尝试之下:
module MainModule
using Parameters # Parameters provides unpack() macro
using DataFrames # DataFrames used to store results in a DataFrame
type ModelParameters
U::Function
γ::Float64
end
function ModelParameters(;
U::Function = c -> if γ == 1.0; log(c); else (c^(1-γ)-1)/(1-γ) end,
γ::Float64 = 2.0,
)
ModelParameters(U, γ)
end
function show_constants(mp::ModelParameters)
@unpack γ = ModelParameters(mp)
d = DataFrame(
Name = ["γ"],
Description = ["parameter of the function"],
Value = [γ]
)
return(d)
end
function show_functions(mp::ModelParameters)
@unpack U = ModelParameters(mp)
d = DataFrame(
Name = ["U"],
Description = ["function"],
Value = [U]
)
return d
end
export
ModelParameters
show_constants,
show_functions
end # end of main module
现在我执行模拟并保留记录:
using MainModule
mp = ModelParameters()
MainModule.show_constants(mp)
1×3 DataFrames.DataFrame
│ Row │ Name │ Description │ Value │
├─────┼──────┼─────────────────────────────┼───────┤
│ 1 │ "γ" │ "parameter of the function" │ 2.0 │
MainModule.show_functions(mp)
1×3 DataFrames.DataFrame
│ Row │ Name │ Description │ Value │
├─────┼──────┼─────────────┼───────────────┤
│ 1 │ "U" │ "function" │ MainModule.#2 │
所以我的方法使用参数值,但不使用函数。我怎么能用以下内容替换MainModule.#2
?
选项(i)
c -> if γ == 1.0; log(c); else (c^(1-γ)-1)/(1-γ) end,
选项(ii)(代替γ= 2.0的数值)
(c^(1-2.0)-1)/(1-2.0)
或简化版本,例如1-c^(-1.0)
我的问题与Julia: show body of function (to find lost code)有关,但更容易,因为函数体不会“丢失”,但在我的源代码中可以随时使用。
答案 0 :(得分:1)
您可以找到类似的讨论here,在我看来,适合单行的函数的最佳解决方案是这样的:
type mytype
f::Function
s::String
end
mytype(x::String) = mytype(eval(parse(x)), x)
Base.show(io::IO, x::mytype) = print(io, x.s)
而不是将函数作为表达式移交,而是将其作为字符串提供:
t = mytype("x -> x^2")
你正在调用这个函数
t.f(3)
并访问String表示,如下所示:
t.s