朱莉娅:获得一个功能的身体

时间:2017-07-16 23:26:23

标签: julia

如何访问函数体?

上下文:我在模块中有函数,我用特定的参数值执行。我想“记录”这些参数值和相应的功能形式。在我的尝试之下:

    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)有关,但更容易,因为函数体不会“丢失”,但在我的源代码中可以随时使用。

1 个答案:

答案 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