Преобразование типов

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

Так как символьные названия типов относятся к деталям реализации, то явное преобразование в конкретный тип данных производится с помощью вызова функции с именем типа, т.е. :Bool(), :StrWide(), :Int64() и т.д.

Примеры:

Строки и тензоры

# Создать тензор из строки широких символов с автоматическим выводом размера и типа данных
#(тип Int32 будет на системах с Linux, а под Windows тип тензора будет Int16)
> tstr := :Tensor[...]("Тест"); 
[1058, 1077, 1089, 1090,]:Int32

# Тоже самое, но тензор заданной размерности
> t2 := :Tensor[2,2]("Тест");
[
  [1058, 1077,], [1089, 1090,],
]:Int32

# Создать символьную строку из тензора
> :StrWide(tstr) 
Тест

# Изменить тип данных тензора без изменения размерности
> :Float64[...](t2) 
[
  [1058, 1077,], [1089, 1090,],
]:Float64

# Изменить размерность тензора и его тип 
# (в данном случае с частичной потерей данных)
> t3 := :Int8[4]( t2 ) 
[34, 53, 65, 66,]:Int8

# Логическое значение - скаляр
>:Bool( [0, 53, 65, 66,] ); 
1:Bool

# Или так (тензор нулевой размерности)
>:Bool[0]( [0, 53, 65, 66,] ); 
1:Bool

# Тензор логических значений без изменения размера 
>:Bool[_]( [0, 53, 65, 66,] ); 
[0, 1, 1, 1,]:Bool

Словари

# Создать тензор из словаря с автоматическим выводом размера 
>:Tensor[...]( (1,2,3,) ); 
[1, 2, 3,]:Int8

# Преобразовать байтовую строку в одномерный тензор
>:Tensor[_]( 'first second' ) 
[102, 105, 114, 115, 116, 32, 115, 101, 99, 111, 110, 100,]:Int8

# Получаем тензор из словаря с такими же данными
>:Tensor[...]( ('first', space=32, second='second',) ) 
[102, 105, 114, 115, 116, 32, 115, 101, 99, 111, 110, 100,]:Int8

# Логическое значение - скаляр
>:Bool( (0,1,2,3,) ); 
1:Bool

# Тензор логических значений
>:Bool[...]( (0,1,2,3,) ); 
[0, 1, 1, 1]:Bool


# Различия между  "..." и "_"

# Автоматический вывод размеров измерений
>:Tensor[...]( ((1,2,3,), (4,5,6,), (7,8,9,),) ); 
[ 
    [1, 2, 3,], [4, 5, 6,], [7, 8, 9,]
]:Int8

# Одномерный тензор с произвольным размером
>:Tensor[_]( ((1,2,3,), (4,5,6,), (7,8,9,),) ); 
[ 1, 2, 3, 4, 5, 6, 7, 8, 9,]:Int8