Иерархия типов и обобщения

NewLang имеет закрытую систему типов. т.е. любой новый тип данных, которые создает пользователь, обязательно должен быть наследником одного из уже существующих, т.е. расширять один из них. Такой поход напоминает создание классов в языке Java, в котором каждый новый класс имеет в своих родителях класс Object.

С помощью обобщений (generics) можно писать код, который может работать с любым совместимым типом данных.

Фрагмент иерархии типов данных (строки и числа, а в скобках указаны синонимы типов):

:Any -+-> :Arithmetic -+-> :Tensor -+-> :Integer --> :Int64   ...  --> :Int8 --> :Bool
      |                |            |               (:DWord64)        (:Char)
      |                |            |                                 (:Byte)
      |                |            |
      |                |            +-> :Number --> :Float64 --> :Float32 --> :Float16 --> ...
      |                |            |              (:Double)    (:Single)
      |                |            |
      |                |            +-> :Complex ...
      |                | 
      |                +-> :Rational
      | 
      +-> :String -+-> :StrChar
      |            |  (:FmtChar)
      |            |
      |            +-> :StrWide
      |               (:FmtWide)
      |            
      |
     ...

Обобщенные типы

  • :Any - обобщенный тип для всех остальных типов данных
  • :Arithmetic - обобщенный тип для всех числовых типов
  • :Tensor - обобщенный тип для чисел, которые можно представить в машинном формате
  • :Integer - обощенный тип для всех целочисленных типов данных
  • :Number - обощенный тип для всех чисел с плавающей точкой
  • :Complex - обощенный тип для всех комплексных чисел
  • :String - обощенный тип для текстовых строк

Примеры определения функций с обобщенными типами

    only_int8(arg:Int8):Int8 :=  ... ;   # Функиця принимает и возвращает только :Int8

    any_int(arg:Integer):Integer :=  ... ;  # Функиця принимает и возвращает только целые числа

    any_tensor(arg:Tensor):Tensor :=  ... ;# Функиця принимает и возвращает любые машинные типы чисел
    
    any_any1(arg:Any):None :=  ... ; # Функиця принимает любой тип аргумента и ничего не возвращает 

    any_any2(arg) :=  ... ;     # Тип не указан - функиця можен принимать и возвращать любой тип