OberonCore
https://forum.oberoncore.ru/

"Типизированные константы"
https://forum.oberoncore.ru/viewtopic.php?f=22&t=1237
Страница 2 из 3

Автор:  Madzi [ Среда, 05 Ноябрь, 2008 19:24 ]
Заголовок сообщения:  Re: "Типизированные константы"

И всё-таки мы ушли от темы.
Вот сейчас мне нужно иметь матрицы преобразований (поворота) типа
Код:
Move: ARRAY 4, 4 OF REAL =
  [[ 1,  0,  0,  0],
   [ 0,  1,  0,  0],
   [ 0,  0,  1,  0]
   [dx, dy, dz, 1]];

и что же их тоже хранить в отдельном файле ?

Автор:  igor [ Среда, 05 Ноябрь, 2008 19:41 ]
Заголовок сообщения:  Re: "Типизированные константы"

Valery Solovey писал(а):
Что Вы подразумеваете под форматированием? Если Вы где-то в тексте поставили (или не поставили) возврат каретки, то это тоже фроматирование.
Возврат каретки, перевод строки, символ табуляции и смена регистра букв я не считаю форматированием, а курсив, bold, смена шрифта по среди текста и такое прочее -- это форматирование.
Valery Solovey писал(а):
Форматирование средствами КП трудоёмко как для человека, составляющего меню, так и для каркаса, читающего его время от времени.
А кому сейчас легко? :) Если серьёзно, то задача не особенно трудна, если Вы умеете строить распознающие автоматы.

Автор:  igor [ Среда, 05 Ноябрь, 2008 19:52 ]
Заголовок сообщения:  Re: "Типизированные константы"

Madzi писал(а):
И всё-таки мы ушли от темы.
Вот сейчас мне нужно иметь матрицы преобразований (поворота) типа
...
и что же их тоже хранить в отдельном файле ?
Если я Вас правильно понял, эти матрицы пригодны для большого круга графических задач, и не планируется активно менять их в будущем. В этом случае, лучше записать поэлементное присваивание, и поместить код в библиотеку.

Автор:  Ярослав Романченко [ Среда, 05 Ноябрь, 2008 20:28 ]
Заголовок сообщения:  Re: "Типизированные константы"

Madzi писал(а):
Вот сейчас мне нужно иметь матрицы преобразований (поворота)
Ведь все они образуются на базе единичной матрицы. Следовательно, в модуле объявляется единичная матрица, в секции BEGIN она инициализируется. А далее определяются процедуры-конструкторы которые создают нужную матрицу беря за основу единичную, и подставляя изменяемые параметры. Чем не устраивает такой вариант?

Автор:  Евгений Темиргалеев [ Среда, 05 Ноябрь, 2008 20:49 ]
Заголовок сообщения:  Re: "Типизированные константы"

Игорь Лоскутов писал(а):
Правильно, на некотором формальном языке. И раз мне приходится его знать и применять для того, чтобы получить работоспособную программу, то его можно рассматривать как расширение основного языка.
Я бы назвал это языком описания меню. И его не обязательно знать чтобы получить работоспособную программу. Этот язык надо знать, если Вы хотите настроить меню ББ.
Игорь Лоскутов писал(а):
То есть форматирование может быть, но оно должно быть (ИМХО) встроено в редактор кода, а не в саму текстовую модель.
Если Вы работаете в ББ, то текстовая модель -- это (хотите Вы этого или нет :) ):
Цитата:
Модуль TextModels определяет текстовые модели, которые являются моделями-контейнерами и содержат форматированный текст, в который могут быть внедрены произвольные отображения.

Не забывайте, что Вы работаете в компонентной среде!
- есть текст -- текстовая модель. Она может хранить "....". Ей глубоко до балды, что это за текст: документация, исходный, описание меню и т.д. и т.п. Есть текстовое отображение, которое позволяет смотреть и редактировать содержимое текстовой модели. Это не специализированный редактор кода/ресурсов/меню. Это просто редактор (текстовой модели).
- есть построитель меню. Он использует текст, чтобы извлечь из него описание меню. Форматирование для него роли не играет.
- есть компилятор. Он использует текст, чтобы считать из него текст модуля. Форматирование для него роли не играет.
....
Это независимые друг от друга компоненты. Чтобы пользоваться какой-то из них, Вам нужно знать именно её. Знание других не требуется.

Автор:  Евгений Темиргалеев [ Среда, 05 Ноябрь, 2008 21:03 ]
Заголовок сообщения:  Re: "Типизированные константы"

Игорь Лоскутов писал(а):
Madzi писал(а):
...и что же их тоже хранить в отдельном файле ?
В этом случае, лучше записать поэлементное присваивание, и поместить код в библиотеку.
В подсистеме Ogl, например, так и делают.
Код:
PROCEDURE  Set4f (OUT a: ARRAY OF GL.Float;  a0, a1, a2, a3: REAL);
BEGIN
   a[0] := SHORT(a0);  a[1] := SHORT(a1); 
   a[2] := SHORT(a2);  a[3] := SHORT(a3)
END Set4f;

Кстати можно завести единичную матрицу:
Код:
move := e; move[3,0] := dx; ...

Автор:  Madzi [ Четверг, 06 Ноябрь, 2008 00:07 ]
Заголовок сообщения:  Re: "Типизированные константы"

Я конечно рад за другие системы, но хотелось бы иметь статические матрицы поворота (по 5 градусов на каждую ось), а приходится делать так:
Код:
PROCEDURE RotateX(alpha: REAL): Matrix3d;
VAR
  m: Matrix3d;
BEGIN
  m[0, 0] := 1; m[0, 1] :=   0;                     m[0, 2] := 0;
  m[1, 0] := 0; m[1, 1] :=   Math.cos(alpha); m[1, 2] := Math.sin(alpha);
  m[2, 0] := 0; m[2, 1] :=  -Math.sin(alpha);  m[2, 2] := Math.cos(alpha);
  RETURN m
END RotateX;

Автор:  Илья Ермаков [ Четверг, 06 Ноябрь, 2008 00:09 ]
Заголовок сообщения:  Re: "Типизированные константы"

А какая для Вас разница между константами и переменными, экспортированными только для чтения, которые при загрузке модуля будут инициализированы нужными значениями?

Автор:  Madzi [ Четверг, 06 Ноябрь, 2008 00:28 ]
Заголовок сообщения:  Re: "Типизированные константы"

Илья Ермаков писал(а):
А какая для Вас разница между константами и переменными, экспортированными только для чтения, которые при загрузке модуля будут инициализированы нужными значениями?

Разница в наглядности.

Автор:  Илья Ермаков [ Четверг, 06 Ноябрь, 2008 08:06 ]
Заголовок сообщения:  Re: "Типизированные константы"

Да ну...
Вынесите в отдельный модуль группу таких "констант" - и всего-то делов.

Автор:  Ярослав Романченко [ Четверг, 06 Ноябрь, 2008 09:42 ]
Заголовок сообщения:  Re: "Типизированные константы"

Madzi писал(а):
Я конечно рад за другие системы, но хотелось бы иметь статические матрицы поворота (по 5 градусов на каждую ось), а приходится делать так:
Почему нельзя сделать так?
Код:
MODULE Matrices; (** AUTHOR ""; PURPOSE ""; *)

IMPORT
   Math;
   
TYPE
   Matrix3d* = ARRAY 3, 3 OF REAL;
   
VAR
   Identity-: Matrix3d;
   RotateX5-: Matrix3d;
   
PROCEDURE RotateX*(alpha: REAL): Matrix3d;
VAR
  m: Matrix3d;
BEGIN
   m := Identity;
   m[1, 1] :=   Math.cos(alpha); m[1, 2] := Math.sin(alpha);
   m[2, 1] :=  -Math.sin(alpha);  m[2, 2] := Math.cos(alpha);
   RETURN m
END RotateX;

PROCEDURE Init;
VAR
   i, j: SHORTINT;
BEGIN
   (* Identity matrix init *)
   FOR j := 0 TO 2 DO
      FOR i := 0 TO 2 DO
         IF i = j THEN
            Identity[i, j] := 1
         ELSE
            Identity[i, j] := 0
         END
      END
   END;
   RotateX5 := RotateX(5 * Math.pi / 180)
END Init;

BEGIN
   Init;
END Matrices.
Как иначе Вы предпологаете, что-бы компилятор вычислил значения Math.cos(5 * Math.pi / 180) и Math.sin(5 * Math.pi / 180)? Ведь для этого нужно импортировать модуль Math, выполнить чтение константы pi и вызов функций sin и cos. Или напишете заранее вычисленные значения? Что будет с наглядностью в таком случае? :)

Автор:  igor [ Четверг, 06 Ноябрь, 2008 10:10 ]
Заголовок сообщения:  Re: "Типизированные константы"

Евгений Темиргалеев писал(а):
Не забывайте, что Вы работаете в компонентной среде! /...
Евгений, Вы попали в самую точку. Истинная глубинная причина нашего спора не в том, что мы как-то по разному представляем себе назначение ресурсов и т. д., а в том, что некоторые идеи, реализованные в Блэбокс, вступили в противоречие с моими собственными идеями. Компонентную среду можно реализовать по-разному, сохранив основные принципы. И Блэкбокс мне тем и нравится, что если что-то не устраивает, то садись и делай как тебе нравится (с учётом лицензионных ограничений :) ). После Delphi от такой свободы просто дух захватывает

Автор:  Александр Ильин [ Четверг, 06 Ноябрь, 2008 10:20 ]
Заголовок сообщения:  Re: "Типизированные константы"

Код:
PROCEDURE Init;
VAR
   i, k: SHORTINT;
BEGIN
   (* Identity matrix init *)
   ASSERT(LEN(Identity) = LEN(Identity[0]), 20); (* square matrix *)
   Identity[0, 0] := 1;
   FOR i := 1 TO LEN(Identity) - 1 DO
      FOR k := 0 TO i - 1 DO (* from side to (but excluding) diagonal *)
         Identity[i, k] := 0; (* fill with zeroes *)
         Identity[k, i] := 0 (* from both sides *)
      END
      Identity[i, i] := 1 (* put diagonal element *)
   END
END Init;

Автор:  Trurl [ Четверг, 06 Ноябрь, 2008 10:30 ]
Заголовок сообщения:  Re: "Типизированные константы"

Илья Ермаков писал(а):
Да ну...
Вынесите в отдельный модуль группу таких "констант" - и всего-то делов.

Без строк тоже можно было бы обойтись.
Код:
 s[0]:='H';  s[1]:='e';  s[2]:='l';  s[3]:='l';  s[4]:='o';  s[5]:=' ';
 s[6]:='w';  s[7]:='o';  s[8]:='r';  s[9]:='l';  s[10]:='d';  s[11]:='!';
 s[12]:=0X;

Автор:  igor [ Четверг, 06 Ноябрь, 2008 10:48 ]
Заголовок сообщения:  Re: "Типизированные константы"

Trurl писал(а):
Без строк тоже можно было бы обойтись.
Верно подмечено :lol: .
Главный вопрос "Чем так плохи конструкторы массивов?" пока повис в воздухе. Хотелось бы услышать внятные неоспоримые доводы, как про GOTO

Автор:  Madzi [ Четверг, 06 Ноябрь, 2008 11:07 ]
Заголовок сообщения:  Re: "Типизированные константы"

Повторюсь ещё раз для всех.
Разница в наглядности!

Для примера Borland Pascal (Delphi):
Код:
UNIT Matrix;
INTERFACE
TYPE
  Matrix3d = ARRAY [0..3, 0..3] OF REAL;
CONST
  Ident: Matrix3d =
 ((1, 0, 0, 0),
  (0, 1, 0, 0),
  (0, 0, 1, 0),
  (0, 0, 0, 1));
IMPLEMENTATION
END.


Тоже на Active Oberon
Код:
MODULE Matix;
TYPE
  Matrix3d* = ARRAY 4, 4 OF REAL;
VAR
  Ident-: Matix3d;
  i, j: INTEGER;
BEGIN
  FOR i:=0 TO 3 DO
    FOR j:=0 TO 3 DO
      IF i = j THEN
        Ident[i, j] := 1;
      ELSE
        Ident[i, j] := 0
      END
    END
  END
END Matrix.

Автор:  igor [ Четверг, 06 Ноябрь, 2008 11:21 ]
Заголовок сообщения:  Re: "Типизированные константы"

Вариант с Active Oberon выигрывает только в том, что позволяет легко адаптировать алгоритм для единичной матрицы любой разумной размерности.
В случае же маленькой размерности, как в приведённом примере, то вариант Delphi намного лучше, особенно если вспомнить, что программы пишутся не только для компиляторов, но и для людей.

Автор:  Ярослав Романченко [ Четверг, 06 Ноябрь, 2008 11:38 ]
Заголовок сообщения:  Re: "Типизированные константы"

В случае Оберона даже если-бы компилятор и допускал инициализацию массивов, их можно было-бы инициализировать только чем-то легко вычислимым без обращения к библиотекам... Поскольку, не знает компилятор, что такое sin и cos.
Для инициализации одной лишь единичной матрицы этого пожалуй хватило-бы :) Стоит ли необходимость усложнения компилятора такой возможности?
Избавлениё от библиотечных функций в компиляторе не только его упростило, а ещё и уменьшило зависимость от платформы. И кроме того насколько возросла гибкость... нужна математика с одинарной точностью импортируем Math, нужна с двойной импортируем Math := MathL.
А человек, читающий текст программы должен понимать в теории "что такое единичная матрица, и счём её едят" :)

PS. Можно привести вид единичной матрицы и в коментарии:
Код:
(* Identity matrix
  | 1  0  0  0 |
  | 0  1  0  0 |
  | 0  0  1  0 |
  | 0  0  0  1 |
*)
так даже нагляднее, нет мусора из скобок и запятых :)

Автор:  Info21 [ Четверг, 06 Ноябрь, 2008 12:07 ]
Заголовок сообщения:  Re: "Типизированные константы"

Madzi писал(а):
Повторюсь ещё раз для всех.
Разница в наглядности!
Если циклы в одну кучу не сваливать, то наглядности вполне достаточно:
Код:
MODULE Matix;
TYPE  Matrix3d* = ARRAY 4, 4 OF REAL;
VAR
  Ident-: Matix3d;
  i, j: INTEGER;
BEGIN
  FOR i:=0 TO 3 DO
    FOR j:=0 TO 3 DO
      Ident[i, j] := 0
    END
  END;
  FOR i:=0 TO 3 DO
    Ident[i, i] := 1
  END
END Matrix.

Автор:  igor [ Четверг, 06 Ноябрь, 2008 12:21 ]
Заголовок сообщения:  Re: "Типизированные константы"

Ярослав Романченко писал(а):
Избавлениё от библиотечных функций в компиляторе не только его упростило, ...
Строго говоря, не полностью избавился. DevCPC486 вызывает процедуры NewRec и NewArr из Kernel.
Хотя, модуль Kernel в некотором смысле можно рассматривать как продолжение (или начало?) компилятора, слишком уж он специфичен.

Страница 2 из 3 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/