Size: a a a

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

2020 October 26

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
В зависимости от того, что компилятор решит.
источник

VG

Viktor G. in Язык программирования Julia / Julia programming language
Alexander Plavin
абстрактный тип часто не сработает, например если у меня есть мой тип MyCoolArray <: AbstractArray, и я хочу его сделать ещё и таблицей
да и вообще это типичная практика в джулии, задавать интерфейс трейтом а не абстрактным супертипом
Кстати, еще один способ компоновать разные функциональности - делать параметрический тип с композицией и форвардом методов, типа:
struct Foo{Bar}
   parent::Bar  
end

Отчасти так сделаны многие обертки над массивами, те же таблицы:
using IndexedTables
a = table((x=1:100, y=randn(100)))
typeof(a)

Вернут: IndexedTable{StructArrays.StructArray{NamedTuple{(:x, :y),Tuple{Int64,Float64}},1,NamedTuple{(:x, :y),Tuple{Array{Int64,1},Array{Float64,1}}},Int64}} - NamedTuple, обернутый в  StructArray, обернутый в IndexedTable
источник
2020 October 27

AK

Alexandr Krotov in Язык программирования Julia / Julia programming language
Alexander Plavin
остальные вопросы не понял
Как примеры, если я отошлю открытый файл ( IOStream ) как параметр в функцию, в функции будет close(IOStream), сама она возвращает nothing, то по итогу изначальный стрим тоже окажется закрыт?

И я так понял если передавать mutable структуру, и изменить одно из ее полей в функции, то это изменит оригинальную структуру т.к. передается такая структура по ссылке?
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
julia> mutable struct Foo
          n::Int
      end

julia> function f!(x)
          x.n += 1
      end
f! (generic function with 1 method)

julia> foo = Foo(1)
Foo(1)

julia> f!(foo)
2

julia> foo
Foo(2)


Восклицательный знак никакого значения для компилятора не имеет, это просто соглашение, чтобы внешние пользователи знали, что функция меняет значение аргумента.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
IOStream немного отдельная штука, внутри себя он содержит указатель (дескриптор файла? прошу прощения могу немного путаться в терминологии) и при работе с ним просто вызывает соответствующие C функции. Поэтому если внутри какой-то функции вы закрываете IOStream, то вызывается соответствующая C функция и работать с ним дальше уже нельзя.

В этом смысле объект типа IOStream можно скопировать при помощи deepcopy например, но при этом не откроется новый дескриптор файла, а будет скопирован предыдущий, поэтому при закрытии копии, файл будет закрыт глобально.

Собственно это одна из проблем потоков, потому что они получаются не thread safe  из-за такой реализации.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
echo "Hello" > /tmp/test.txt

# Iteration 1: normal flow
julia> io = open("/tmp/test.txt")
IOStream(<file /tmp/test.txt>)

julia> read(io, String)
"Hello\n"

julia> read(io, String)
""

julia> close(io)

# Iteration 2: io copy
julia> io = open("/tmp/test.txt")
IOStream(<file /tmp/test.txt>)

julia> io2 = deepcopy(io)
IOStream(<file /tmp/test.txt>)

julia> read(io2, String)
"Hello\n"

julia> read(io, String)
""

julia> close(io2)

julia> close(io)
double free or corruption (!prev)
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Ну и кстати да, по поводу копирования или передачи по ссылке, есть ещё такой момент (это как раз то самое "определяется компилятором"), что компилятор может какие-то нетривиальные преобразования над кодом произвести, например сделать функцию inline.

То есть потенциально, следующий код
f(x) = x + 1

function g()
 res = 0
 for i in 1:10
   res += f(res)
 end
end


может во внутреннем представлении компилятора выглядеть так
function g()
 res = 0
 for i in 1:10
   res += res + 1
 end

 return res
end


То есть никаких вызовов функции f и как следствие передачи по ссылке или не по ссылке, вообще нет.
источник

АО

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

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Поэтому я вначале и сказал - в качестве нулевого приближения, можно разделять мутабельные и иммутабельные переменные. Но в целом, есть много нюансов имплементации.
источник

AK

Alexandr Krotov in Язык программирования Julia / Julia programming language
Спасибо за развернутый ответ👍
источник
2020 October 28

AZ

Aleksey Zhdanov in Язык программирования Julia / Julia programming language
Сам то выехал? Или тут заглох?
источник
2020 October 30

VG

Viktor G. in Язык программирования Julia / Julia programming language
Как получить тип параметра T?
struct Foo{T}
   x::T
end
f = Foo(10)
typeof(f) # нужен не Foo{Int}, а просто Int
источник

A

Alexandr in Язык программирования Julia / Julia programming language
Например так:

julia> struct Foo{T}
          x::T
      end

julia> function foo_type(a::Foo{T}) where {T}
       return T
       end
foo_type (generic function with 1 method)

julia> a = Foo(10)
Foo{Int64}(10)

julia> foo_type(a)
Int64
источник

RS

Roman Samarev in Язык программирования Julia / Julia programming language
julia> type(s::Foo) = typeof(s.x)

julia> type(Foo("123"))
String

julia> type(Foo([1,2,3]))
Array{Int64,1}

julia> type(Foo(1))
Int64
источник

VG

Viktor G. in Язык программирования Julia / Julia programming language
Да, точно, спасибо
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Первый способ чуть лучше, по двум причинам
1. Его можно использовать не только для того, чтобы тип возвращать.
2. Второй способ не будет работать, если тип поля будет тоже параметрическим. Придётся рекурсивно спускаться до самого дна (это если получится).
struct Foo{T}
 x::Vector{T}
end
источник

VG

Viktor G. in Язык программирования Julia / Julia programming language
да, там вообще нет поля с таким типом, поэтому foo_type(::Foo{T}) = T
источник

RS

Roman Samarev in Язык программирования Julia / Julia programming language
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
А почему переводят на 50 языков, а носителей всего три типа?
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Спамеры такие спамеры 😞
источник