История изменений
Исправление korvin_, (текущая версия) :
Если классически, то никак, потому что идея выделенного типа для значения вредна. То есть, число 1 имеет тип 1, byte, fixnum, positive-fixnum, integer, ...? Правильный путь — использовать предикаты для проверки принадлежности нужному типу.
Если очень надо в стиле CL, то cond на несколько десятков строк.
Очень удобно при попытке реализовать «внешнюю» (по отношению к типам) диспетчеризацию, ЕМНИП, смотрел я как-то исходники Swindle или чего-то подобного, не вижу в «cond на несколько десятков строк» ничего правильного. А уж для многообразия типов Racket понадобится не одна сотня строк. + Нужно предусмотреть предоставление возможности добавления в этот cond пользовательских структур, экзистенциальных типов и прочих.
Предикаты и в CL никто писать не запрещает через deftype, например, только на практике от них проку не так много, ИМХО, в отличие от удобной рефлексии.
Немножко не понял: что именно «это всё»?
То, что ты перечислил.
Но в ядре Racket есть нити (на базе нитей ОС), есть эфемероны (базовый блок для любых коллекций слабых ссылок), есть метки продолжений и т. д.
Ну вот, куча примитивов таки зашита в ядро, а не реализованы библиотеками (для) Scheme.
Исправление korvin_, :
Если классически, то никак, потому что идея выделенного типа для значения вредна. То есть, число 1 имеет тип 1, byte, fixnum, positive-fixnum, integer, ...? Правильный путь — использовать предикаты для проверки принадлежности нужному типу.
Если очень надо в стиле CL, то cond на несколько десятков строк.
Очень удобно при попытке реализовать «внешнюю» (по отношению к типам) диспетчеризацию, ЕМНИП, смотрел я как-то исходники Swindle или чего-то подобного, не вижу в «cond на несколько десятков строк» ничего правильного. А уж для многообразия типов Racket понадобится не одна сотня строк. + Предоставление возможности добавления в этот cond пользовательских структур и экзистенциальных типов.
Предикаты и в CL никто писать не запрещает через deftype, например, только на практике от них проку не так много, ИМХО, в отличие от удобной рефлексии.
Немножко не понял: что именно «это всё»?
То, что ты перечислил.
Но в ядре Racket есть нити (на базе нитей ОС), есть эфемероны (базовый блок для любых коллекций слабых ссылок), есть метки продолжений и т. д.
Ну вот, куча примитивов таки зашита в ядро, а не реализованы библиотеками (для) Scheme.
Исходная версия korvin_, :
Если классически, то никак, потому что идея выделенного типа для значения вредна. То есть, число 1 имеет тип 1, byte, fixnum, positive-fixnum, integer, ...? Правильный путь — использовать предикаты для проверки принадлежности нужному типу.
Если очень надо в стиле CL, то cond на несколько десятков строк.
Очень удобно при попытке реализовать «внешнюю» (по отношению к типам) диспетчеризацию, ЕМНИП, смотрел я как-то исходники Swindle или чего-то подобного, не вижу в «cond на несколько десятков строк» ничего правильного. А уж для многообразия типов Racket понадобится не одна сотня строк. + Предоставление возможности добавления в этот cond пользовательских структур и экзистенциальных типов.
Предикаты и в CL никто писать не запрещает через deftype, только на практике от них проку не так много, ИМХО, в отличие от удобной рефлексии.
Немножко не понял: что именно «это всё»?
То, что ты перечислил.
Но в ядре Racket есть нити (на базе нитей ОС), есть эфемероны (базовый блок для любых коллекций слабых ссылок), есть метки продолжений и т. д.
Ну вот, куча примитивов таки зашита в ядро, а не реализованы библиотеками (для) Scheme.