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 писал(а): ...и что же их тоже хранить в отдельном файле ? В этом случае, лучше записать поэлементное присваивание, и поместить код в библиотеку.Код: 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 ""; *) Как иначе Вы предпологаете, что-бы компилятор вычислил значения Math.cos(5 * Math.pi / 180) и Math.sin(5 * Math.pi / 180)? Ведь для этого нужно импортировать модуль Math, выполнить чтение константы pi и вызов функций sin и cos. Или напишете заранее вычисленные значения? Что будет с наглядностью в таком случае?
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. |
Автор: | 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 писал(а): Без строк тоже можно было бы обойтись. Верно подмечено .Главный вопрос "Чем так плохи конструкторы массивов?" пока повис в воздухе. Хотелось бы услышать внятные неоспоримые доводы, как про 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/ |