LINUX.ORG.RU

История изменений

Исправление MOPKOBKA, (текущая версия) :

Ничего этого ненужно. Ни в каком окампле никакой тег ты не добавишь.

Под тегом я имею виду:

type tag = 
  | EtoInt of int
  | EtoStroka of string
Но ты видимо о чем то другом, у тебя нету примера такого списка на С++? Пусть там два элемента разного типа будут.

Аналогично ненужно путать таплы в цпп и таплы во всяких окамлах.

Если взять примитивные типы, исключив тем самым боксинг, то представлении в памяти будет одно и тоже, (int * int * int) == struct { int, int, int}. Есть ли отличия кроме боксинга вызванного GC?

Это ты так говоришь. Зачем оно нужно если ничего не делает?

Разница в видимости, я же написал:

// Без rec можно переопределять переменные
let x = 10 in
let x = x + 20 in
print x // 30

// С rec поведение как в С
let x = 10 in
let rec x = x + 20 in // Ошибка, x еще не назначен
print x 

То, что посмотрел какой-то преобразованный из под компилятора

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

У гц-языка все типы ссылочные.

В Lisp/Smalltalk часто типы размером примерно с указатель вшивают в ссылку, вместо того что бы выделять слот под них в памяти.

Optional не может быть заменой указателя без боксинга. Ты же писал что его нет? Это сложный тип?

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

type 'T option = 
  | None
  | Some of 'T
Тоже боксинг обеспечивает вида struct {int tag; union { void None; GcRef<T> Some; });

Исходная версия MOPKOBKA, :

Ничего этого ненужно. Ни в каком окампле никакой тег ты не добавишь.

Под тегом я имею виду:

type tag = 
  | EtoInt of int
  | EtoStroka of string
Но ты видимо о чем то другом, у тебя нету примера такого списка на С++? Пусть там два элемента разного типа будут.

Аналогично ненужно путать таплы в цпп и таплы во всяких окамлах.

Если взять примитивные типы, исключив тем самым боксинг, но представлении в памяти будет одно и тоже, (int * int * int) == struct { int, int, int}. Есть ли отличия кроме боксинга вызванного GC?

Это ты так говоришь. Зачем оно нужно если ничего не делает?

Разница в видимости, я же написал:

// Без rec можно переопределять переменные
let x = 10 in
let x = x + 20 in
print x // 30

// С rec поведение как в С
let x = 10 in
let rec x = x + 20 in // Ошибка, x еще не назначен
print x 

То, что посмотрел какой-то преобразованный из под компилятора

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

У гц-языка все типы ссылочные.

В Lisp/Smalltalk часто типы размером примерно с указатель вшивают в ссылку, вместо того что бы выделять слот под них в памяти.

Optional не может быть заменой указателя без боксинга. Ты же писал что его нет? Это сложный тип?

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

type 'T option = 
  | None
  | Some of 'T
Тоже боксинг обеспечивает вида struct {int tag; union { void None; GcRef<T> Some; });