索引调用a有更底层的表达形式
getindex(a,x)
函数调用
abs(5)
5
是否有更底层的表达形式呢
例如:
hanshudiaoyong(abs,5)
5
我最近想试试能不能写像这样的程序
“lol”(“we”)
这样 如果有一个类似hanshudiaoyong的函数的话,我就可以通过重载实现这个功能
是的,我知道这个问题应该是元编程,在提问之前也看过,可能我没有找对地方吧 这个call的语法之前还真没看到,感觉有点类似lisp?
不过call不是一个函数,好像不能通过重载来实现类似“lol”(“we”)这样的写法吧?
比如说 如果可以重载
function call(f::string n::tuple)
…
end
可能就可以写出类似“lol”(“we”)的程序了吧
这个只是简写成这样,实际的表示成 Expr 的树。
julia> dump(:(f(a,b) = a+b))
Expr
head: Symbol =
args: Array{Any}((2,))
1: Expr
head: Symbol call
args: Array{Any}((3,))
1: Symbol f
2: Symbol a
3: Symbol b
2: Expr
head: Symbol block
args: Array{Any}((2,))
1: LineNumberNode
line: Int64 1
file: Symbol REPL[8]
2: Expr
head: Symbol call
args: Array{Any}((3,))
1: Symbol +
2: Symbol a
3: Symbol b
julia> ops = (:sin, :cos, :tan, :log, :exp)
(:sin, :cos, :tan, :log, :exp)
julia> [quote Base.$op(a::MyNumber) = MyNumber($op(a.x)) end for op in ops]
5-element Array{Expr,1}:
quote
#= REPL[5]:1 =#
Base.sin(a::MyNumber) = begin
#= REPL[5]:1 =#
MyNumber(sin(a.x))
end
end
quote
#= REPL[5]:1 =#
Base.cos(a::MyNumber) = begin
#= REPL[5]:1 =#
MyNumber(cos(a.x))
end
end
quote
#= REPL[5]:1 =#
Base.tan(a::MyNumber) = begin
#= REPL[5]:1 =#
MyNumber(tan(a.x))
end
end
quote
#= REPL[5]:1 =#
Base.log(a::MyNumber) = begin
#= REPL[5]:1 =#
MyNumber(log(a.x))
end
end
quote
#= REPL[5]:1 =#
Base.exp(a::MyNumber) = begin
#= REPL[5]:1 =#
MyNumber(exp(a.x))
end
end
懂了 这个call是这个结构体的head成员。其实之前弄自动微分的时候看过的,刚想起来……
不知道能不能通过重载来实现调用非Function类型,就像通过重载getindex函数来实现索引非Array类型一样……
看来我是试图使用julia中并不存在的语法
可能我试图diy一个julia里的函数成员吧,,,可能就是让某些东西看(仅仅是从外表看起来)起来更顺眼一点,,没有也无所谓
其实最开始只是看到有很多可以自定义的东西,比如用getindex和setindex能自定义索引, lastindex能自定义end,,就想到是不是函数调用的形式(+)()也可以自定义呢,,可能我是XY的典型了 所以既然如此这个话题还是就此结束吧,避免浪费大家的宝贵时间
如果你只是想像重载 getindex
那样重载「函数调用」这个操作,来运行 "lol"("we")
这样的代码的话,直接写就好了。
julia> (s::String)(a::String) = s * a
julia> "lol"("me")
"lolme"
Julia 里面任何对象都是可以被像函数一样调用的。
2 个赞