函数调用是否有更底层的形式

索引调用a[x]有更底层的表达形式
getindex(a,x)
函数调用
abs(5)
5
是否有更底层的表达形式呢
例如:
hanshudiaoyong(abs,5)
5
我最近想试试能不能写像这样的程序
“lol”(“we”)
这样 如果有一个类似hanshudiaoyong的函数的话,我就可以通过重载实现这个功能

你可能想要元编程

另外: Julia 的 AST · Julia中文文档

f(x)	(call f x)

是的,我知道这个问题应该是元编程,在提问之前也看过,可能我没有找对地方吧 这个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类型一样……

你到底要做什么呢?不是 Function 当然没法调用了。

直接说你的目的,避免 X-Y Problem

看来我是试图使用julia中并不存在的语法 :joy:
可能我试图diy一个julia里的函数成员吧,,,可能就是让某些东西看(仅仅是从外表看起来)起来更顺眼一点,,没有也无所谓
其实最开始只是看到有很多可以自定义的东西,比如用getindex和setindex能自定义索引[], lastindex能自定义end,,就想到是不是函数调用的形式(+)()也可以自定义呢,,可能我是XY的典型了 :joy:所以既然如此这个话题还是就此结束吧,避免浪费大家的宝贵时间

成员函数?

想动 julia 的编译器是有可能的
例:基于上下文的派发:挂起临时变量内存 - 知乎

只是为了美观,如果能接收宏的形式,我个人觉的用宏还是挺合适的,也不会带来性能开销。

如果你只是想像重载 getindex 那样重载「函数调用」这个操作,来运行 "lol"("we") 这样的代码的话,直接写就好了。

julia> (s::String)(a::String) = s * a

julia> "lol"("me")
"lolme"

Julia 里面任何对象都是可以被像函数一样调用的。

2 个赞