Аст выражение

Аст выражение

О коммутативности: Юлия не предполагает, что a*b совпадает с b*a (пример: пусть a и b — матрицы). Однако методы функции *(a,b) для некоторых конкретных комбинаций типов действуют коммутативно, например, когда a и b являются числами.

Поскольку вы говорите о символах, я думаю, что вы хотите работать с символическим представлением выражений. Там, по крайней мере, два способа сделать это:

  1. Работайте с АСТ выражения. Вы можете указать любое выражение :(expr) (иногда :expr достаточно, зависит от приоритета оператора):

    julia> ex = :(x*y*z) :(x * y * z)  julia> typeof(ex) Expr 

    Заметим, что порядок факторов сохранен (хотя ассоциативности нет). Вы можете проверить Expr, глядя на него head и args полей:

    julia> ex.head :call  julia> ex.args 4-element Array{Any,1}:  :*  :x  :y  :z 

    Аргументы могут быть, например, символами (типа Symbol), постоянными значениями и другими выражениями. Этот метод хорошо работает, если вы хотите написать свои собственные макросы, которые обрабатывают выражения, поскольку вход в макрос является AST для его аргументов.

  2. Определите свои типы и перегрузите * функцию. Пример: с

    abstract Symbolic   # might as well make these immutable immutable Sym <: Symbolic     name::Symbol end  immutable Prod <: Symbolic     x::Symbolic     y::Symbolic end  # The * function is imported by default. # Usually, we need to import a function # from Base before extending it. *(x::Symbolic, y::Symbolic) = Prod(x, y) 

    ты можешь сделать

    julia> x, y = Sym(:x), Sym(:y) (Sym(:x),Sym(:y))  julia> x*y Prod(Sym(:x),Sym(:y)) 

    Так как наша функция *(x::Symbolic, y::Symbolic) сохраняет порядок аргументов, мы можем увидеть ее в созданном объекте Prod.

В большинстве языков второй вариант — это ваш единственный вариант. Первый вариант более прямой, поскольку вам не нужно писать новую структуру AST для себя, и вам не нужно выполнять выражение, чтобы получить его представление. Однако какой из них более подходит, зависит от приложения. Если вы хотите связать разные свойства с вашими переменными, второй подход кажется более простым.

Это что-то вроде этого, что вы искали?

источник поделиться

Источник: qaru.site


Добавить комментарий