OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 15 Октябрь, 2019 02:13

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




Начать новую тему Ответить на тему  [ Сообщений: 92 ]  На страницу Пред.  1, 2, 3, 4, 5
Автор Сообщение
СообщениеДобавлено: Среда, 02 Октябрь, 2019 14:18 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 332
Откуда: Украина, Днепропетровская обл.
Новости проекта Ofront+. Я работаю над реализацией конкатенации строк. Сейчас уже компилится такой код:
Код:
MODULE TestConcat; IMPORT Console;

CONST Str* = "String 1 "+ 0DX + 0AX + 0X + "String 2 " + '"' + "'" + 0FFX;
Str2* = "  '  ";
Str3* = '  "  ';

VAR str: ARRAY 13 OF SHORTCHAR;

BEGIN
   str := "Hello, ";
   str := str + "World";
   Console.WriteStr(str); Console.WriteLn;
   Console.WriteInt(LEN(str$)); Console.WriteLn;
END TestConcat.

Также подправил вывод строк в браузере символьников и, на мой взгляд, он сейчас их выводит лучше, чем ББ-шный:
Код:
DEFINITION TestConcat;

  CONST
    Str = "String 1 " + 0DX + 0AX + "String 2 " + 22X + "'" + 0FFX;
    Str2 = "  '  ";
    Str3 = '  "  ';

END TestConcat.
Для сравнения вот что выдаёт ББ:
Код:
DEFINITION TestConcat;

   CONST
      Str = "String 1 " + 0DX + 0AX + "String 2 "'ÿ";
      Str2 = "  '  ";
      Str3 = "  "  ";

END TestConcat.

Ещё я оптимизировал операцию str := str + str2, которая до моей правки сводилась к двум низкоуровневым операциям:
Код:
MODULE TestConcat; VAR str: ARRAY 13 OF SHORTCHAR;
BEGIN
   str := str + "World"
END TestConcat.
Код:
   __STRCOPYSS(TestConcat_str, TestConcat_str, 13); // <-- copy string into itself
   __STRAPNDSS("World", TestConcat_str, 13);

После правки операция копирования строки саму в себя убрана.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 02 Октябрь, 2019 14:20 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 332
Откуда: Украина, Днепропетровская обл.
Кстати, обращаю внимание мэйнтейнеров собственных сборок BlackBox. Я не удивлюсь, если в них присутствует эта же проблема - копирование строки саму в себя при конкатенации. Похоже, что OMinc эту оптимизацию планировали, просто она у них не срабатывает по недосмотру: процедура OPV.SameExp (n1, n2: OPT.Node): BOOLEAN возвращает TRUE, если выражение одно и то же. Она-то и призвана отсечь копирование строки саму в себя. Но после псевдооперации преобразования типа "массив" к типу "строка" он уже не воспринимается этой процедурой как та же сущность, и она срабатывает некорректно. Правлю так:

Код:
   PROCEDURE SameExp (n1, n2: OPT.Node): BOOLEAN;
   BEGIN
+      IF (n2^.class = Nderef) & (n2^.typ^.form = String) THEN n2 := n2^.left END;
      WHILE (n1^.class = n2^.class) & (n1^.typ = n2^.typ) DO

Т.е. если последняя операция это преобразование массива к строке, то мы для сравнения её откатываем. Это работает.

Ссылка на коммит: https://github.com/Oleg-N-Cher/OfrontPl ... bf834b295d

Отпишитесь, пожалуйста, если удастся исправить это в какой-то сборке BlackBox.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 03 Октябрь, 2019 17:51 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 154
Откуда: Питер
Код:
MODULE Test;

TYPE
  Arr = ARRAY 3,4 OF REAL;

PROCEDURE Do1 (): POINTER TO Arr;
  BEGIN
    RETURN NIL
  END Do1;

END Test.


Хм... Что-то по прежнему не генерируется .c-файл для этого тестового модуля


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 03 Октябрь, 2019 18:33 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 154
Откуда: Питер
Vinovat, oshibsha. Ispol'zoval ne tot exe-shnik.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 03 Октябрь, 2019 18:42 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 332
Откуда: Украина, Днепропетровская обл.
Ну вот и хорошо. Там ещё сделана маленькая правочка, связанная с этой проблемой. Перекачайте бинарь.

Эх... я уже привык, что про баги пишут публично, а хвалят приватно. Наверно чтобы никто не видел. ;-)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 06 Октябрь, 2019 01:28 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 909
Откуда: Киев
Планируется ли поддержку O7 довести до возможности собирать код на О7 или как и в мультиобероне поддержка будет приблизительной?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 06 Октябрь, 2019 12:46 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 332
Откуда: Украина, Днепропетровская обл.
Поддержка планируется, хотя смущает разброс разночтений сообщения о языке.

Дело за желающими помочь на уровне "теперь сделай вот то-то". Я открыт к таким предложениям.

А в мультиобероне есть поддержка O7? Она там вроде заявлена только гипотетически.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 06 Октябрь, 2019 13:05 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 909
Откуда: Киев
Oleg N. Cher писал(а):
Я открыт к таким предложениям.
Для того и спросил, чтобы узнать, нужны ли Вам такие предложения.

Oleg N. Cher писал(а):
смущает разброс разночтений
Зря смущает, критических разночтений там нет. Если же имеющиеся разночтения Вы считаете критическими, то и O2, и КП должны смущать во многом. Но является ли это препятствием для чего-то?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 06 Октябрь, 2019 17:02 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 332
Откуда: Украина, Днепропетровская обл.
GameHunter писал(а):
Тестовый модуль в ББ компилируется:

Код:
MODULE Test;

TYPE
  Arr = ARRAY 2,3 OF REAL;
  Ptr = POINTER TO Arr;

VAR
  a:Arr;

PROCEDURE Do (): Ptr;
  BEGIN
    RETURN NIL
  END Do;

BEGIN
  a:=Do()^;
END Test.

Ofront+ выдаёт ошибку: 16:10 err 78 dereferenced object is not a variable

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

Исправил. Спасибо за информацию.



Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 07 Октябрь, 2019 21:09 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 332
Откуда: Украина, Днепропетровская обл.
Я было подумал, что будут какие-то накладки соединения вызова метода с разыменованием с синтаксисом супервызова, но попробовал и убедился, что ^ в супервызове пишется до скобок, а ^ при разыменовании — после скобок. Получается любопытный синтаксис, который работает сейчас и в Ofront'е+, и в BlackBox:
Код:
MODULE Test;

TYPE
   Arr = ARRAY 2,3 OF REAL;
   Ptr = POINTER TO Arr;

TYPE
   Father = EXTENSIBLE RECORD END;
   Child = RECORD (Father) END;

VAR
   a: Arr;

PROCEDURE (VAR self: Father) Do (): Ptr, NEW, EXTENSIBLE;
BEGIN
   RETURN NIL
END Do;

PROCEDURE (VAR self: Child) Do (): Ptr;
BEGIN
   a := self.Do^()^; (* Супервызов с разыменованием *)
   RETURN NIL
END Do;

END Test.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 08 Октябрь, 2019 20:43 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1133
Откуда: СССР v2.0 rc 1
Не надо так делать, Олег.
Забавно и не более. Нельзя давать расползаться семантике и синтаксису.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 09 Октябрь, 2019 14:15 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 332
Откуда: Украина, Днепропетровская обл.
Это не я так делаю, Валера. Это OMinc так сделали. Я поддерживаю совместимость с КП, не более того.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 92 ]  На страницу Пред.  1, 2, 3, 4, 5

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


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

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


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

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