OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Среда, 24 Апрель, 2024 23:30

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 321 ]  На страницу Пред.  1 ... 10, 11, 12, 13, 14, 15, 16, 17  След.
Автор Сообщение
 Заголовок сообщения: Re: Обратная сторона мейнстрима...
СообщениеДобавлено: Среда, 06 Август, 2008 17:39 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Иван Кузьмицкий писал(а):
Чтобы "нормально" закодировать решение задачи на не-обероне, нужна очень высокая квалификация как автора, так и читателя, дабы обмен информацией автор-текст-читатель всё-таки случился. "Кодирование" и декодирование задачи на обероне проще, т.к. сам язык кодирования, или нотация, проще.

Проще чем на каких языках? Проще чем на Си? Возможно...
А как насчёт сравнения с тем же Питоном? Будет ли здесь Оберон проще? Я уверен, что нет, отнюдь не проще...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обратная сторона мейнстрима...
СообщениеДобавлено: Среда, 06 Август, 2008 17:48 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Флаг Вам - проведите и так очевидное сравнение по критерию количества мусорного контекста (не связанного с предметной областью), которое нужно держать в голове при работе на одном, другом, третьем языке...

Я не буду спорить, что Питон будет смотреться неплохо. До определённого уровня. Выше которого появляется мейнстрим-ООП и спёртые из ФП закидоны. Т.е. опять отбалдышные артефакты.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обратная сторона мейнстрима...
СообщениеДобавлено: Среда, 06 Август, 2008 18:26 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Возвращаясь к преобразованию различных сущностей в строку...

Давайте рассмотрим такую задачу:

Дано: некий гетерогенный контейнер (например, массив или список, ну что там идеоматичнее и удобнее для конкретного языка). Каких именно типов значения там находятся. мы заранее не знаем, но, предположим, там точно имеются только такие значения, которые можно конвертировать в строку.

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

Решение на C# с использованием метода ToString():
Код:
using System;

namespace toStringTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Object[] xs = new Object[] { 1, 2.3, 'a', "bc" };

            foreach (Object x in xs)
            {
                System.Console.WriteLine(x.ToString());
            }
        }
    }
}
Вывод:
Код:
1
2,3
a
bc

Решение на Хаскелле с использованием экзистенциальной квантификации контейнера по классу типов Show:
Код:
module Main where

import Control.Monad (forM_)

data Showable = forall a. (Show a) => S a

instance Show Showable where
    show (S a) = show a

xs = [ S 1, S 2.3, S 'a', S "bc" ] :: [Showable]

main = do
    forM_ xs $ \x ->
        putStrLn $ show x
Вывод:
Код:
1
2.3
'a'
"bc"

Решение на Оберонах -- оберонщики, ваш ход! ;о)
Допустим, у вас уже есть туча модулей для каждого типа, в котором определены процедуры ToString, такие как Int.ToString, Real.ToString, Char.ToString, String.ToString (не уверен в нужности последней процедуры), и т.д. и т.п.

Покажите, если нетрудно, как здесь реализуется компонентный подход к преобразованию значений разных (заранее неизвестных) типов в строку?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обратная сторона мейнстрима...
СообщениеДобавлено: Среда, 06 Август, 2008 18:48 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Vlad писал(а):
А Integer - это сколь угодно специфичный класс.
ОК. Я просто не дошёл до классов в С++ ещё. Понял только на уровне перевода. Извиняюсь.
Vlad писал(а):
Это вы говорили, что видели MFC?
Не я.
Vlad писал(а):
Очень хорошая цитата. Поработав на языках, которые позволяет выражать вещи в намного более приближенных к предметной области терминах нежели "целое число от 0 до MAX" и "массив символов", на оберон пересесть трудно.
не надо путать божий дар с яичницей. Можно сделать на Обероне хоть сколько классов типа этого злосчастного uint и прочих, но я пока такого не встречал. Может, потому что оно и нафиг никому не надо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обратная сторона мейнстрима...
СообщениеДобавлено: Среда, 06 Август, 2008 18:49 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Опять задачки от балды?
Кому, для чего, куда этот гетерогенный список?

Хорошо, вот не умозрительная, а практическая задача.
Я работаю с древовидными списками аля Рефал-Лисп. У меня есть модуль для их поддержки:

Код:
DEFINITION RocotStructs;

   TYPE
      Term = POINTER TO ABSTRACT RECORD
         next-, prev-: Term;
         pos-: INTEGER;
         (t: Term) Expr (): Expr, NEW, EXTENSIBLE;
         (t: Term) HandleMsg (VAR msg: Message), NEW, EMPTY
      END;

      Expr = POINTER TO EXTENSIBLE RECORD (Term)
         first-, last-: Term;
         (e: Expr) Delete (from, to: Term), NEW;
         (e: Expr) Insert (t, after: Term), NEW;
         (e: Expr) Paste (source: Expr; from, to, after: Term), NEW
      END;

      Message = ABSTRACT RECORD  END;

   PROCEDURE LookupTerm (e: Expr; IN type: ARRAY OF CHAR; after: Term): Term;

END RocotStructs.


Естественно, я хочу иметь возможность удобно просматривать свои деревья, когда мне это нужно.

Пусть у меня есть древовидное выражение expr.
Тогда я просто делаю так: RocotDebug.ShowExpr(expr).

И у меня на экране появляется документ, показывающий узлы дерева в иерархии стандартных складок ББ. Щёлкнув по синему ромбику, я могу увидеть все поля каждого узла дерева.
Вложение:
trees.gif
trees.gif [ 30.36 КБ | Просмотров: 6184 ]


Вас, конечно, интересует реализация моей функции ShowExpr?
Вот она:
Код:
MODULE RocotDebug;

   IMPORT Sys := RocotSys, Structs := RocotStructs, Text := RocotText, BCF := RocotBCF, StdFolds, DevDebug, Views, TextModels, TextViews, Log;

   PROCEDURE OutTerm (wr: Text.Writer; term: Structs.Term);
      VAR type: ARRAY 256 OF CHAR;
            adr: Sys.Address;
            ref: Views.View;
   BEGIN
      Sys.GetTypeName(term, type);
      adr := Sys.AdrOf(term);
      ref := DevDebug.HeapRefView(adr, type);
      wr.String(' ' + type + ' '); wr.Core()(TextModels.Writer).WriteView(ref, Views.undefined, Views.undefined)
   END OutTerm;

   PROCEDURE OutExpr (wr: Text.Writer; expr: Structs.Expr);
      VAR type: ARRAY 256 OF CHAR;
            t: Structs.Term;
            f: StdFolds.Fold;
            txt: Text.Model;
            wr1: Text.Writer;
   BEGIN
      ASSERT(expr # NIL, 20);
      Sys.GetTypeName(expr, type);
      txt := wr.Base().New();
      wr1 := txt.NewWriter(NIL); wr1.indent.char := '   ';
      OutTerm(wr1, expr); wr1.Ln(wr.indent.level + 1);
      t := expr.first;
      WHILE t # NIL DO
         IF (t IS Structs.Expr) & (t(Structs.Expr).first # NIL) THEN
            OutExpr(wr1, t(Structs.Expr))
         ELSE
            OutTerm(wr1, t)
         END;
         t := t.next;
         IF t # NIL THEN wr1.Ln(0) END
      END;
      wr1.Ln(-1);
      f := StdFolds.dir.New(StdFolds.collapsed, type$, txt.Core()(TextModels.Model));
      wr.Core()(TextModels.Writer).WriteView(f, Views.undefined, Views.undefined);
      OutTerm(wr, expr);
      f := StdFolds.dir.New(StdFolds.collapsed, "", NIL);
      wr.Core()(TextModels.Writer).WriteView(f, Views.undefined, Views.undefined)
   END OutExpr;

   PROCEDURE ShowExpr* (expr: Structs.Expr);
      VAR t: Text.Model;
            wr: Text.Writer;
   BEGIN
      t := BCF.WrapText(TextModels.dir.New());
      wr := t.NewWriter(NIL);
      OutExpr(wr, expr);
      Views.OpenAux(TextViews.dir.New(t.Core()(TextModels.Model)), "Rocot Expression")
   END ShowExpr;

END RocotDebug.


Очень сложно? Выводится полноценное интерактивное представление, прошу заметить, а не ваши убогие Console.WriteLn. :-)
Вывод значений элементарных типов спрятан в тех самых синих ромбиках - это стандартная вьюшка ББ, из дамп-отладчика.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обратная сторона мейнстрима...
СообщениеДобавлено: Среда, 06 Август, 2008 18:59 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Интересный у Вас подход, Илья, с переводом неудобных для Вас тем в другое русло... :о)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обратная сторона мейнстрима...
СообщениеДобавлено: Среда, 06 Август, 2008 19:06 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Цитата:
Опять задачки от балды?
Кому, для чего, куда этот гетерогенный список?

Ну какая Вам разница? Компонентное мышление должно предполагать, что кому-то для чего-то оно нужно!

Я Вам предложил простенькую задачку, с решением в несколько строк, Вы же в ответ вывалили непонятную портянку, в которой разбираться нужно неделю...
Зачем???


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обратная сторона мейнстрима...
СообщениеДобавлено: Среда, 06 Август, 2008 20:47 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Пётр Кушнир писал(а):
Можно сделать на Обероне хоть сколько классов типа этого злосчастного uint и прочих, но я пока такого не встречал. Может, потому что оно и нафиг никому не надо.


А я уже говорил, почему на обероне так никто не делает. Потому что делать такое можно забодаться (как и уже обсуждавшиеся ленивые вычисления). Как вы на обероне, например, представите целое, обозначающее колонку в таблице? Напишите RECORD с приватным INTEGER'ом внутри + операции над ним (инкремент, декремент, инициализация и т.д.) и все это поместите в отдельный модуль? А как потому будет выглядеть работа с таким модулем? Понятно, что такой ценой это "нафиг никому не надо", проще зафигачить INTEGER, а потом отлаживать и путать колонки со строками. А, например, в C++ цена этому - одна строка, декларирующая такой специфический тип. И не надо потом каждый раз в документацию лазить и смотреть какой из аргументов функции колонка, а какой - строка, компилятор сам все проверит и скажет.


Последний раз редактировалось Vlad Среда, 06 Август, 2008 21:24, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обратная сторона мейнстрима...
СообщениеДобавлено: Среда, 06 Август, 2008 21:01 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Евгений Темиргалеев писал(а):
Vlad писал(а):
А результатом функции будет мусор? Просто скажите "да" и покончим с этим
В КП результатом функции не может быть мусор.


Во-первых - может (досаточно вернуть локальную непроиниченную переменную). Во-вторых, под "мусором" я подразумевал не просто заранее неопределенное значение, а нечто "грязное" и неимеющее логического смысла (потому как произошла ошибка), но при этом вызывающий код может это результат легально "отмыть" и пустить в оборот.

Евгений Темиргалеев писал(а):
- ошибка времени выполнения "функция без RETURN", если процедура-функция при выполнении не завершается оп-м RETURN (в тексте RETURN есть, но не при любом раскладе до него доходит выполнение)


Злобно :) А чего ж он не ругается?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обратная сторона мейнстрима...
СообщениеДобавлено: Среда, 06 Август, 2008 21:36 

Зарегистрирован: Вторник, 18 Сентябрь, 2007 08:48
Сообщения: 108
Цитата:
Vlad
А, например, в C++ цена этому - одна строка, декларирующая такой специфический тип. И не надо потом каждый раз в документацию лазить и смотреть какой из аргументов функции колонка, а какой - строка, компилятор сам все проверит и скажет.


Хочу уточнить. Речь идет о типе, несовместимом с оригиналом?
Например, в Delphi я напишу
Код:
type
  SimpleInt = Integer;

Этот новый тип (алиас) будет совместим с оригиналом.

А если так
Код:
type
  SimpleInt = type Integer;

Новый алиас уже не будет совместим со старым. Это совершенно иной тип. При этом операции присвоения работают корректно, а как параметр - несовместим с Integer.

Вы последний случай имели в виду (учитывая специфику Delphi)?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обратная сторона мейнстрима...
СообщениеДобавлено: Среда, 06 Август, 2008 22:45 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Edward Ivanov писал(а):
Хочу уточнить. Речь идет о типе, несовместимом с оригиналом?


В данном случае - да.

Edward Ivanov писал(а):
Новый алиас уже не будет совместим со старым. Это совершенно иной тип. При этом операции присвоения работают корректно, а как параметр - несовместим с Integer.


Несовместимый как параметр - это конечно лучше, чем ничего. Но еще лучше иметь полный контроль на преобразованиями типов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обратная сторона мейнстрима...
СообщениеДобавлено: Четверг, 07 Август, 2008 05:26 

Зарегистрирован: Среда, 17 Январь, 2007 03:59
Сообщения: 225
Geniepro писал(а):
Возвращаясь к преобразованию различных сущностей в строку...

Давайте рассмотрим такую задачу:

Дано: некий гетерогенный контейнер (например, массив или список, ну что там идеоматичнее и удобнее для конкретного языка). Каких именно типов значения там находятся. мы заранее не знаем, но, предположим, там точно имеются только такие значения, которые можно конвертировать в строку.

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


TYPE
PtrString = POINTER TO ARRAY OF CHAR;

Object = POINTER TO ABSTRACT RECORD
END;

Integer = POINTER TO RECORD (Object)
...
END;

Double = POINTER TO RECORD (Object)
...
END;
и т.д.

PROCEDURE (o: Object) ToString* (): PtrString, NEW, ABSTRACT;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обратная сторона мейнстрима...
СообщениеДобавлено: Четверг, 07 Август, 2008 07:15 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Штирлиц писал(а):
Код:
TYPE
     PtrString = POINTER TO ARRAY OF CHAR;

      Object = POINTER TO ABSTRACT RECORD
                   END;

       Integer = POINTER TO RECORD (Object)
                       ...
                    END;
         
       Double = POINTER TO RECORD (Object)
                      ...
                   END;
       и т.д.

PROCEDURE (o: Object) ToString* (): PtrString, NEW, ABSTRACT;

Ну и куда же пропали эти ваши "базовые типы"? :lol:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обратная сторона мейнстрима...
СообщениеДобавлено: Четверг, 07 Август, 2008 09:28 

Зарегистрирован: Среда, 17 Январь, 2007 03:59
Сообщения: 225
Geniepro писал(а):
Ну и куда же пропали эти ваши "базовые типы"? :lol:


А что мне мешает их создать и построить библиотеку на их основе?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обратная сторона мейнстрима...
СообщениеДобавлено: Четверг, 07 Август, 2008 09:37 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Штирлиц писал(а):
Geniepro писал(а):
Ну и куда же пропали эти ваши "базовые типы"? :lol:


А что мне мешает их создать и построить библиотеку на их основе?

Так ведь тут же весь шум-гам был вокруг чисел, которые не должны иметь методов! Вы же фактически даёте им методы!

Ну и потом, Вы собираетесь делать объектные обёртки прям вокруг всех возможных типов?
Насколько вообще это соответствует духу оберонов?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обратная сторона мейнстрима...
СообщениеДобавлено: Четверг, 07 Август, 2008 09:55 

Зарегистрирован: Среда, 17 Январь, 2007 03:59
Сообщения: 225
Geniepro писал(а):
Ну и потом, Вы собираетесь делать объектные обёртки прям вокруг всех возможных типов?
Насколько вообще это соответствует духу оберонов?


Я этот шум не поднимал. Потому как мне как-то не принципиально
писать i.ToString() или ToString(i);

Geniepro писал(а):
Ну и потом, Вы собираетесь делать объектные обёртки прям вокруг всех возможных типов?

Если это потребуется для решения какой-то проблемы, то почему бы и нет?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обратная сторона мейнстрима...
СообщениеДобавлено: Четверг, 07 Август, 2008 10:22 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Geniepro писал(а):
Ну и потом, Вы собираетесь делать объектные обёртки прям вокруг всех возможных типов?
Насколько вообще это соответствует духу оберонов?


А как же метод i.ToString() у каждого класса в C#?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обратная сторона мейнстрима...
СообщениеДобавлено: Четверг, 07 Август, 2008 10:25 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Vlad писал(а):
Как вы на обероне, например, представите целое, обозначающее колонку в таблице? Напишите RECORD с приватным INTEGER'ом внутри + операции над ним (инкремент, декремент, инициализация и т.д.) и все это поместите в отдельный модуль? А как потому будет выглядеть работа с таким модулем? Понятно, что такой ценой это "нафиг никому не надо", проще зафигачить INTEGER, а потом отлаживать и путать колонки со строками. А, например, в C++ цена этому - одна строка, декларирующая такой специфический тип. И не надо потом каждый раз в документацию лазить и смотреть какой из аргументов функции колонка, а какой - строка, компилятор сам все проверит и скажет.

Влад, ну не могу я припомнить ни разу за годы, чтобы мне приходилось искать такую вот ошибку - с путаницей параметров... Я сам не против того, чтобы в точке вызова явно разделять вход и выход. И субтипизация от базовых типов аля-Ада мне тоже не претит. Но явной повседневной необходимости в них не чувствуется (возможно, потому, что не приходится работать с нагромождёнными библиотеками с туевой кучей запутанных параметров в каждой функции, аля DirectX какой-нить. "Разделяй и властвуй").
Так что это непринципиально. Особенно для языка, который по своему балансу является современной абстракцией неймановской машины, а не специальным прикладным средством. На самом деле штука, как я уже говорил, вот в чём - позвольте программисту работать в "однопоточном режиме", избавляя от низкоуровневого или наоборот - забубённо-абстрактного мусора - и количество ляпов в логике (типа путаницы колонки со столбцом или скорости с высотой) резко уменьшится.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обратная сторона мейнстрима...
СообщениеДобавлено: Четверг, 07 Август, 2008 10:26 

Зарегистрирован: Среда, 17 Январь, 2007 03:59
Сообщения: 225
Иван Кузьмицкий писал(а):
Как говорится, с добрым утром. Проясните плиз, разве метод i.ToString() у каждого класса в C# святым духом навеяло?


Духом Андерса Хейлсберга :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обратная сторона мейнстрима...
СообщениеДобавлено: Четверг, 07 Август, 2008 10:32 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Geniepro писал(а):
Цитата:
Опять задачки от балды?
Кому, для чего, куда этот гетерогенный список?

Ну какая Вам разница? Компонентное мышление должно предполагать, что кому-то для чего-то оно нужно!

Я Вам предложил простенькую задачку, с решением в несколько строк, Вы же в ответ вывалили непонятную портянку, в которой разбираться нужно неделю...
Зачем???


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

Если говорить о КП/ББ, то механизм для удобного (для разработчика) показа ЛЮБЫХ структур данных уже обеспечена в среде. А показ для пользователя всё равно не сделаешь единообразно через ваш чудный ToString. Впрочем, в ББ можно сваять и для пользователя "морду ввода-вывода" одной командой меню...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 321 ]  На страницу Пред.  1 ... 10, 11, 12, 13, 14, 15, 16, 17  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB