Инструменты пользователя

Инструменты сайта


oberon:generics

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
oberon:generics [2024/07/05 18:38]
comdiv создано
oberon:generics [2024/07/15 15:48] (текущий)
comdiv
Строка 1: Строка 1:
 ====== Обобщённые модули в стандартном Oberon ====== ====== Обобщённые модули в стандартном Oberon ======
  
-Сам по себе язык не предусматривает специальной поддержки этого механизма, но он может использоваться как принцип.+Обобщённые модули (дженерики) — модули, параметризированные по константам, процедурам и типам без требования к генетичекой связи через расширение записей. Такое обобщение кода позволяет повысить либо его переиспользуемость, либо эффективность вместе со статическими гарантиями.
  
 +Существуют диалекты Oberon с явной поддержкой параметризуемых модулей, но сам по себе исходный язык не предусматривает явных конструкций параметризации. Но что интересно, даже без явной поддержки обобщённые модули  всё равно могут использоваться как принцип за счёт самой модульности, требуя лишь расширенного понимания того, что стоит за IMPORT. Подход настолько прост, что может использоваться даже без инструментальной поддержки, хотя и не исключает её. Если при явном введении дженериков в Oberon используют обобщение понятия модуля, то здесь, наоборот, обобщённые модули рассматриваются как частный случай использования обычных модулей. 
  
 Здесь представлен схематичный пример. Дополнительные детали воплощения для достижения нужных качеств представить несложно. Здесь представлен схематичный пример. Дополнительные детали воплощения для достижения нужных качеств представить несложно.
  
-«Параметризированный» модуль может ничем не отличаться от обычного модуля, так как все необходимые объявления он берёт из импортированного модуля, который и служит параметром:+==== Параметризация модуля ==== 
 +«Параметризированный» модуль может ничем не отличаться от обычного модуля, так как все необходимые объявления он берёт из импортированного модуля, который и служит ему параметром:
  
   MODULE List; IMPORT Param;   MODULE List; IMPORT Param;
Строка 34: Строка 36:
      
   END List.   END List.
 +
 +==== Формальный и фактический параметры-модули ====
 +
 +Следующий исходный(формальный) параметр-модуль не только служит заготовкой для фактических параметров-модулей, но также позволяет напрямую использовать исходный список как динамически типизированный, что тоже имеет смысл:
 +
 +  MODULE Param; IMPORT V;
 +   TYPE T* = POINTER TO V.Base;
 +  END Param.
  
 Фактический параметр-модуль с нужными объявлениями: Фактический параметр-модуль с нужными объявлениями:
Строка 43: Строка 53:
 При должном обобщённом подходе модули-параметры могут использоваться вместе с разными параметризированными модулями. При должном обобщённом подходе модули-параметры могут использоваться вместе с разными параметризированными модулями.
  
 +
 +==== Специализация параметризированного модуля ====
 Псевдо-код для специализации модуля где-то в сборочной системе: Псевдо-код для специализации модуля где-то в сборочной системе:
  
Строка 57: Строка 69:
   Modules.Spec("ListRec := List(Param := ParamRec)")   Modules.Spec("ListRec := List(Param := ParamRec)")
    
-Использование специализированного модуля:+==== Использование специализированного модуля ====
  
   MODULE UseList;   MODULE UseList;
Строка 80: Строка 92:
   END UseList.   END UseList.
  
-Следующий исходный(формальный) параметр-модуль не только служит болванкой для фактических параметров-модулей, но также позволяет напрямую использовать исходный список как динамически типизированный: +==== Ссылки ====
- +
-  MODULE Param; IMPORT V; +
-   TYPE T* POINTER TO V.Base; +
-  END Param. +
 Весь код в [[https://vostok.oberon.org/sandbox.html?view=36fnga6vx46g-ListGeneric|песочнице]]. Весь код в [[https://vostok.oberon.org/sandbox.html?view=36fnga6vx46g-ListGeneric|песочнице]].
  
 [[https://vostok-space.blogspot.com/2023/11/primitive-generic.html|Источник]] [[https://vostok-space.blogspot.com/2023/11/primitive-generic.html|Источник]]
oberon/generics.1720193922.txt.gz · Последнее изменение: 2024/07/05 18:38 — comdiv