2017-09-22 55 views
1

我想要更改的优先级,以便先应用它。因此下面的函数组合中不需要括号。这可能吗?更改运算符优先级为∘

julia> ∘(f,g) = x->f(g(x))    
∘ (generic function with 1 method)  

julia> (sqrt ∘ abs)(randn())    
0.9069709279812338 

julia> sqrt ∘ abs(randn())    
(::#15) (generic function with 1 method)           
+1

这'∘(F,G)= X-> F(G(X)))'已在Base中定义。 –

+1

在技术上可以改变Julia源代码的优先级(我认为是'src/julia-parser.scm'文件),但是,当然,这不是推荐的或便携式的。所以,我想说,简短(并且推荐)的答案是否定的。 –

回答

1

Julia在元编程方面很强大,所以您必须能够制作自己的微语言。

我只是初学者在朱莉娅,所以下面的代码只是我的小实验! (它是inclomplete因为与解析多行的问题)

但也许可能是鼓舞人心:

module M 
    macro x(a) 
    w = r"(\w+)\s*∘\s*(\w+)" # trying to find words around ∘ 
    s = s"(\1 ∘ \2)"   # and enclosed them into brackets 
    b = replace("$a", w, s) 
    return :(eval(parse($b))) 
    end 
end 

import M 

[email protected](
    sqrt ∘ abs(randn()) 
) 
+0

而不是解析它是更好的使用parseall从https://stackoverflow.com/a/46366560/1782955,而不是'M. @ x( sqrt∘abs(randn()) )'更好地使用'M 。@ x begin sqrt∘abs(randn()) end'。它允许“翻译”多行,多表达式块。 – Liso