Size: a a a

Язык программирования Julia / Julia programming language

2020 December 18

KH

Katie Hyatt in Язык программирования Julia / Julia programming language
Кажется Джулия не использует broadcasted с обеими функциями в 6ой, возможно потому что они не анонимные, как вы сказали. Если пишу

f3 = x -> [2*y for y in x] # not a tuple :(

(1,2,3,4).|> f1 |> f3

Работает без проблем
источник

RS

Roman Samarev in Язык программирования Julia / Julia programming language
julia> dump(:((1,2,3,4) .|> x->x+1 |> x->2x))
Expr
 head: Symbol call
 args: Array{Any}((3,))
   1: Symbol .|>
   2: Expr
     head: Symbol tuple
     args: Array{Any}((4,))
       1: Int64 1
       2: Int64 2
       3: Int64 3
       4: Int64 4
   3: Expr
     head: Symbol ->
     args: Array{Any}((2,))
       1: Symbol x
       2: Expr
         head: Symbol block
         args: Array{Any}((2,))
           1: LineNumberNode
             line: Int64 1
             file: Symbol REPL[150]
           2: Expr
             head: Symbol call
             args: Array{Any}((3,))
               1: Symbol |>
               2: Expr
               3: Expr

julia> dump(:((1,2,3,4) .|> f1 |> f2))
Expr
 head: Symbol call
 args: Array{Any}((3,))
   1: Symbol |>
   2: Expr
     head: Symbol call
     args: Array{Any}((3,))
       1: Symbol .|>
       2: Expr
         head: Symbol tuple
         args: Array{Any}((4,))
           1: Int64 1
           2: Int64 2
           3: Int64 3
           4: Int64 4
       3: Symbol f1
   3: Symbol f2
источник

RS

Roman Samarev in Язык программирования Julia / Julia programming language
Обратите внимание на то, что на вершине дерева операции разные. В одном случае .|>, в другом - |>
источник

RS

Roman Samarev in Язык программирования Julia / Julia programming language
Выглядит как приоритет head: Symbol -> над вызовом f1/f2
источник

VS

Vladimir Shashkin in Язык программирования Julia / Julia programming language
Katie Hyatt
Кажется Джулия не использует broadcasted с обеими функциями в 6ой, возможно потому что они не анонимные, как вы сказали. Если пишу

f3 = x -> [2*y for y in x] # not a tuple :(

(1,2,3,4).|> f1 |> f3

Работает без проблем
Ну это-то понятно, f3 работает с x , по которому можно итерировать, будь-то массив, кортеж итд. Кстати, этот вариант возвращает вектор. Вариант с анонимными функциями возвращает кортеж ака тупл
источник

KH

Katie Hyatt in Язык программирования Julia / Julia programming language
Да, только хотела показать что Джулия не использует broadcast с второй функцией. Но dump лучше всего.
источник

VS

Vladimir Shashkin in Язык программирования Julia / Julia programming language
Roman Samarev
julia> dump(:((1,2,3,4) .|> x->x+1 |> x->2x))
Expr
 head: Symbol call
 args: Array{Any}((3,))
   1: Symbol .|>
   2: Expr
     head: Symbol tuple
     args: Array{Any}((4,))
       1: Int64 1
       2: Int64 2
       3: Int64 3
       4: Int64 4
   3: Expr
     head: Symbol ->
     args: Array{Any}((2,))
       1: Symbol x
       2: Expr
         head: Symbol block
         args: Array{Any}((2,))
           1: LineNumberNode
             line: Int64 1
             file: Symbol REPL[150]
           2: Expr
             head: Symbol call
             args: Array{Any}((3,))
               1: Symbol |>
               2: Expr
               3: Expr

julia> dump(:((1,2,3,4) .|> f1 |> f2))
Expr
 head: Symbol call
 args: Array{Any}((3,))
   1: Symbol |>
   2: Expr
     head: Symbol call
     args: Array{Any}((3,))
       1: Symbol .|>
       2: Expr
         head: Symbol tuple
         args: Array{Any}((4,))
           1: Int64 1
           2: Int64 2
           3: Int64 3
           4: Int64 4
       3: Symbol f1
   3: Symbol f2
Роман, а почему во втором примере первая операция пайп без точки? Он же самый последний. Они не слева направо выполняются?
источник

RS

Roman Samarev in Язык программирования Julia / Julia programming language
dump(:(…)) показывает реальное дерево AST
источник

RS

Roman Samarev in Язык программирования Julia / Julia programming language
То, как Джулия будет выполнять операцию
источник

VS

Vladimir Shashkin in Язык программирования Julia / Julia programming language
Katie Hyatt
Да, только хотела показать что Джулия не использует broadcast с второй функцией. Но dump лучше всего.
Кажется, когда функции анонимные, джулия делает автоматический бродкаст? А почему? Или все не так?
источник

RS

Roman Samarev in Язык программирования Julia / Julia programming language
Я думаю, там вопрос приоритета операций. ->, |>, .|>
источник

VS

Vladimir Shashkin in Язык программирования Julia / Julia programming language
Vladimir Shashkin
Роман, а почему во втором примере первая операция пайп без точки? Он же самый последний. Они не слева направо выполняются?
Дошло, сверху оператор/функция, которая выполняется самой последней
источник

RS

Roman Samarev in Язык программирования Julia / Julia programming language
В общем, что я вижу. Если в любом месте конвейера есть лямбда, то цепочка раскрывается с конца. Если нет, то последовательно с начала
источник

RS

Roman Samarev in Язык программирования Julia / Julia programming language
julia> dump(:(1 .|> (f->-f) |> f2))
Expr
 head: Symbol call
 args: Array{Any}((3,))
   1: Symbol |>
   2: Expr
     head: Symbol call
     args: Array{Any}((3,))
       1: Symbol .|>
       2: Int64 1
       3: Expr
         head: Symbol ->
         args: Array{Any}((2,))
           1: Symbol f
           2: Expr
             head: Symbol block
             args: Array{Any}((2,))
               1: LineNumberNode
               2: Expr
   3: Symbol f2
источник

RS

Roman Samarev in Язык программирования Julia / Julia programming language
Это ещё интереснее. Сначала раскрыта лямбда, потом .|>, и только потом последний оператор |>
источник

PY

Popov Yuri in Язык программирования Julia / Julia programming language
дааа во смотрю  на такой dump(:((1,2,3,4) .|> x->x+1 |> x->2x)) код и думаю не копал джулию и не буду.  такой же вольфрам
источник

RS

Roman Samarev in Язык программирования Julia / Julia programming language
Этот пример не самый удачный. Он и для читаемости плох, и для понимания. В одном конвейере применять поэлементно или ко всему сразу.
источник

VS

Vladimir Shashkin in Язык программирования Julia / Julia programming language
Roman Samarev
Это ещё интереснее. Сначала раскрыта лямбда, потом .|>, и только потом последний оператор |>
То есть
(1,2,3,4) .|> x->2x |> x->x+1 это, на человеческом языке
(1,2,3,4) .|> x->(2x |> x->x+1), где
x->(2x |> x->x+1) одна большая лямбда. Всем спасибо за дискуссию!
источник

RS

Roman Samarev in Язык программирования Julia / Julia programming language
Если что-то подобное в реальности надо делать, лучше разрезать выражение через дополнительную переменную. Или явно приоритет выделить скобками
источник

RS

Roman Samarev in Язык программирования Julia / Julia programming language
Popov Yuri
дааа во смотрю  на такой dump(:((1,2,3,4) .|> x->x+1 |> x->2x)) код и думаю не копал джулию и не буду.  такой же вольфрам
Я думаю, в любом языке программирования можно придумать нечитаемый пример 🙂
источник