OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Понедельник, 11 Август, 2025 13:14

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




Начать новую тему Ответить на тему  [ Сообщений: 332 ]  На страницу Пред.  1 ... 6, 7, 8, 9, 10, 11, 12 ... 17  След.
Автор Сообщение
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Среда, 28 Август, 2024 13:37 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1562
и p.p.s.: забавно, что буквенные имена дисков в шинде получаются префиксами. а UNC имеет префикс "//". и в принципе в никс-версии никто не мешает эти префиксы тоже как-то обрабатывать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Среда, 28 Август, 2024 16:12 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1562
предварительный дизайн нового файлоинтерфейса.
Код:
MODULE System:Files;

IMPORT
  SYSTEM, System:Kernel, System:Strings, System:Log;

TYPE
  OpenMode* = EMPTY EXTENSIBLE RECORD;
  shared* = EMPTY RECORD (OpenMode);
  exclusive* = EMPTY RECORD (OpenMode);

TYPE
  (* error codes for `Locator` and such; `NIL` is "ok" *)
  FileError* = EMPTY EXTENSIBLE RECORD;
  badName* = EMPTY RECORD (FileError);
  notFound* = EMPTY RECORD (FileError);
  fileExists* = EMPTY RECORD (FileError);
  writeProtected* = EMPTY RECORD (FileError);
  accessDenied* = EMPTY RECORD (FileError);
  notSupported* = EMPTY RECORD (FileError);
  tooBig* = EMPTY RECORD (FileError);
  ioError* = EMPTY RECORD (FileError);
  diskFull* = EMPTY RECORD (ioError); (* `ioError` may be returned instead *)

CONST
  (* attribute bits *)
  directory* = 0;
  readOnly* = 1;
  hidden* = 2;

TYPE
  Offset* = REAL;
  Size* = REAL;

  FileDate* = RECORD
    year*, month*, day*, hour*, minute*, second*: INTEGER;
  END;

  (* it is extensible, because some file systems may return additional info here *)
  FileInfo* = EXTENSIBLE RECORD
    name*: STRING; (* full, with extension, but without any path *)
    length*: Size;
    attr*: SET;
    mdate*: FileDate; (* modified; may be the same as created *)
    cdate*: FileDate; (* created; may be the same as modified *)
  END;

TYPE
  Locator* = POINTER TO ABSTRACT RECORD
    res*: FileError;
  END;

  (* should never return the same locator. may return `NIL` on error.
   * the caller should always check new locator's `.res` field for errors!
   * to duplicate the existing locator, use empty path.
   * always set `loc.res`. *)
  PROCEDURE (loc: Locator) This* (IN path: STRING): Locator, NEW, ABSTRACT;
  (* may return NIL if there is no such thing as "path" for this locator.
   * returned path (if not empty) should be usable to recreate the locator. *)
  PROCEDURE (loc: Locator) Path* (): STRING, NEW, ABSTRACT;
  (* may return NIL if there is no such thing as "real path" for this locator *)
  PROCEDURE (loc: Locator) RealPath* (): STRING, NEW, ABSTRACT;

  PROCEDURE (loc: Locator) New* (): File, NEW, ABSTRACT;
  PROCEDURE (loc: Locator) Old* (IN name: STRING; mode: OpenMode): File, NEW, ABSTRACT;

  (* optional operation; may set "notSupported" error *)
  PROCEDURE (loc: Locator) Delete* (IN name: STRING), NEW, EXTENSIBLE;
  BEGIN loc.res := notSupported; END Delete;

  (* optional operation; may set "notSupported" error *)
  PROCEDURE (loc: Locator) Rename* (IN old, new: STRING), NEW, EXTENSIBLE;
  BEGIN loc.res := notSupported; END Rename;

  (* this doesn't touch the `newloc.res` *)
  PROCEDURE (loc: Locator) Move* (IN old: STRING; newloc: Locator; new: STRING), NEW, EXTENSIBLE;
  BEGIN loc.res := notSupported; END Move;

  (* doesn't touch `.res` of any locator *)
  PROCEDURE (loc: Locator) SamePath* (otherloc: Locator): BOOLEAN, NEW, ABSTRACT;

  (* doesn't touch `.res`. do not compare names directly! *)
  PROCEDURE (loc: Locator) SameName* (IN name0, name1: STRING): BOOLEAN, NEW, ABSTRACT;

  (* may return `NIL`, if iteration is not supported. may also return `old`.
   * theck `.res` field to see if the iteration is failed.
   * if `name` is not empty string, return reader with info about that name (or `NIL`/`old`).
   * in case of error may return `old`, but it will be marked as invalid. *)
  PROCEDURE (loc: Locator) NewReader* (IN name: STRING; old: LocReader): LocReader, NEW, ABSTRACT;


TYPE
  LocReader* = POINTER TO ABSTRACT RECORD END;

  (* return `FALSE` if there are no more items *)
  PROCEDURE (it: LocReader) Read* (OUT fi: FileInfo): BOOLEAN, NEW, ABSTRACT;


TYPE
  File* = POINTER TO ABSTRACT RECORD END;

  (* we'll force-flush data of important files on writing *)
  PROCEDURE (f: File) Important* (), NEW, EMPTY;
  PROCEDURE (f: File) Length* (): Size, NEW, ABSTRACT;
  (* HALT on error *)
  PROCEDURE (f: File) NewReader* (old: Reader): Reader, NEW, ABSTRACT;
  (* HALT on error *)
  PROCEDURE (f: File) NewWriter* (old: Writer): Writer, NEW, ABSTRACT;
  (* write buffers; doesn't fsync for non-important files *)
  PROCEDURE (f: File) Flush* (), NEW, EMPTY;
  PROCEDURE (f: File) Register* (IN name: STRING; OUT res: FileError), NEW, ABSTRACT;
  (* this should not be called, ever! hence the long and ugly name;
   * note that opening the same file several times will return THE SAME file object, and
   * closing it will be disasterous. please, rely on GC for proper file closing. *)
  PROCEDURE (f: File) ForceCloseFile* (), NEW, ABSTRACT;
  (* legacy 32-bit API with error checking *)
  PROCEDURE (f: File) Length32* (): INTEGER, NEW;
  VAR l: Size;
  BEGIN l := f.Length(); ASSERT(l >= 0); ASSERT(l <= MAX(INTEGER)); RETURN (l AS INTEGER);
  END Length32;


TYPE
  Reader* = POINTER TO ABSTRACT RECORD
    eof-: BOOLEAN; (* immediately valid *)
  END;

  PROCEDURE (r: Reader) Base* (): File, NEW, ABSTRACT;
  PROCEDURE (r: Reader) Pos* (): Offset, NEW, ABSTRACT;
  PROCEDURE (r: Reader) SetPos* (pos: Offset), NEW, ABSTRACT;
  (* return number of bytes read. may be less than requested.
   * HALT on error. never return negative result.
   * if `count` is 0, this checks if the data is ready, and this is the
   * only case when the result is always 0. you need to check `eof` field in this case.
   * `eof` field is set to `TRUE` or `FALSE` according to the result. *)
  PROCEDURE (r: Reader) ReadBuff- (adr: SYSTEM.ADDRESS; count: INTEGER): INTEGER, NEW, ABSTRACT;
  (* legacy 32-bit API with error checking *)
  PROCEDURE (r: Reader) Pos32* (): INTEGER, NEW;
  VAR ofs: Offset;
  BEGIN ofs := r.Pos(); ASSERT(ofs >= 0); ASSERT(ofs <= MAX(INTEGER)); RETURN (ofs AS INTEGER);
  END Pos32;

  PROCEDURE (r: Reader) ReadByte* (OUT x: CHAR), NEW;
  BEGIN VOID:r.ReadBuff(SYSTEM.ADR(x), 1); END ReadByte;

  PROCEDURE (r: Reader) ReadBytes* (VAR x: ARRAY OF CHAR), NEW;
  VAR
    rd, left: INTEGER;
    adr: SYSTEM.ADDRESS;
  BEGIN
    left := LEN(x); ASSERT(left > 0);
    adr := SYSTEM.ADR(x[0]);
    WHILE left # 0 DO
      rd := r.ReadBuff(adr, left);
      ASSERT(rd # 0, "file reading error");
      ASSERT((rd >= 0) & (rd <= left));
      DEC(left, rd);
      INC(adr, rd);
    END WHILE
    ASSERT(left = 0, "file reading error");
  END ReadBytes;

  (* return number of bytes read. may be less than requested. *)
  PROCEDURE (r: Reader) ReadData* (VAR x: ARRAY OF CHAR): INTEGER, NEW;
  BEGIN ASSERT(LEN(x) > 0); RETURN r.ReadBuff(SYSTEM.ADR(x[0]), LEN(x)); END ReadData;

  (* custom readers may implement faster version of this *)
  PROCEDURE (r: Reader) ReadLn* (): STRING, NEW, EXTENSIBLE;
  VAR
    res: STRING;
    ch: CHAR;
  BEGIN
    r.ReadByte(^ch);
    IF r.eof THEN RETURN NIL; END IF
    REPEAT
      CAT(@res, ch);
      r.ReadByte(^ch);
    UNTIL r.eof OR (ch = 0AX);
    RETURN res;
  END ReadLn;


TYPE
  Writer* = POINTER TO ABSTRACT RECORD END;

  PROCEDURE (w: Writer) Base* (): File, NEW, ABSTRACT;
  PROCEDURE (w: Writer) Pos* (): Offset, NEW, ABSTRACT;
  PROCEDURE (w: Writer) SetPos* (pos: Offset), NEW, ABSTRACT;
  (* always write the requested number of bytes. failure to write `count` bytes is error.
   * HALT on error. *)
  PROCEDURE (w: Writer) WriteBuff- (adr: SYSTEM.ADDRESS; count: INTEGER), NEW, ABSTRACT;

  (* legacy 32-bit API with error checking *)
  PROCEDURE (w: Writer) Pos32* (): INTEGER, NEW;
  VAR ofs: Offset;
  BEGIN ofs := w.Pos(); ASSERT(ofs >= 0); ASSERT(ofs <= MAX(INTEGER)); RETURN (ofs AS INTEGER);
  END Pos32;

  PROCEDURE (w: Writer) WriteByte* (x: CHAR), NEW;
  BEGIN w.WriteBuff(SYSTEM.ADR(x), 1); END WriteByte;

  PROCEDURE (w: Writer) WriteBytes* (IN x: ARRAY OF CHAR), NEW;
  BEGIN ASSERT(LEN(x) > 0); w.WriteBuff(SYSTEM.ADR(x[0]), LEN(x)); END WriteBytes;

  (* custom writers may implement faster version of this *)
  PROCEDURE (w: Writer) Write* (IN s: STRING), NEW;
  BEGIN IF s # NIL THEN w.WriteBuff(SYSTEM.ADR(s[0]), LEN(s)); END IF
  END Write;

  (* custom writers may implement faster version of this *)
  PROCEDURE (w: Writer) WriteLn* (IN s: STRING), NEW;
  BEGIN
    IF s # NIL THEN w.WriteBuff(SYSTEM.ADR(s[0]), LEN(s)); END IF
    w.WriteByte(0AX);
  END WriteLn;


TYPE
  Driver* = POINTER TO ABSTRACT RECORD END;

  (* return `NIL` for unsupported path *)
  PROCEDURE (d: Driver) This* (IN path: STRING): Locator, NEW, ABSTRACT;
  (* return `NIL` if cannot create a temp file *)
  PROCEDURE (d: Driver) Temp* (): File, NEW, EXTENSIBLE;
  BEGIN RETURN NIL; END Temp;


(* check if `name` is a good file name -- without path and such *)
PROCEDURE IsGoodName* (IN name: STRING): BOOLEAN;
  PROCEDURE IsGoodChar (ch: CHAR): BOOLEAN;
  BEGIN RETURN (ORD(ch) >= 32) & (ch # '/') & (ch # '\') & (ch # ':') & (ch # ';') & (ch # 7FX);
  END IsGoodChar;
VAR pos, len: INTEGER;
BEGIN
  len := LEN(name);
  IF len = 0 THEN RETURN FALSE; END IF
  WHILE (pos # len) & IsGoodChar(name[pos]) DO INC(pos); END WHILE
  IF pos # len THEN RETURN FALSE; END IF
  pos := 0;
  WHILE (pos # len) & (name[pos] = '.') DO INC(pos); END WHILE
  RETURN (pos # len);
END IsGoodName;


(******** driver list ********)

TYPE
  DriverItem- = POINTER TO RECORD
    next-: DriverItem;
    driver-: Driver;
  END;


VAR
  drivers-: DriverItem;


PROCEDURE RegisterDriver* (d: Driver);
VAR
  drivers: GLOBAL;
  di: DriverItem;
BEGIN ASSERT(d # NIL);
  NEW(di); di.driver := d; di.next := drivers; drivers := di;
END RegisterDriver;


(******** high-level API ********)

(* abort if all drivers rejected the path.
 * may return locator with `.res` field set on driver error. *)
PROCEDURE This* (IN path: STRING): Locator;
VAR
  drivers: GLOBAL;
  di: DriverItem;
  loc, rloc: Locator;
BEGIN
  di := drivers;
  WHILE (di # NIL) & (loc = NIL) DO
    loc := di.driver.This(path);
    (* we may get a locator with error here; keep trying, but remember it *)
    IF (loc # NIL) & (loc.res # NIL) THEN
      IF rloc # NIL THEN rloc := loc; END IF
      loc := NIL;
    END IF
    di := di.next;
  END WHILE
  (* return locator with error, if we got one *)
  IF loc = NIL THEN
    IF rloc = NIL THEN HALT("cannot create locator for path '" ~ path ~ "'"); END IF
    loc := rloc;
  END IF
  RETURN loc;
END This;


(* abort on error *)
PROCEDURE Temp* (): File;
VAR
  drivers: GLOBAL;
  di: DriverItem;
  fl: File;
BEGIN
  di := drivers;
  WHILE (di # NIL) & (fl = NIL) DO
    fl := di.driver.Temp();
    di := di.next;
  END WHILE
  ASSERT(fl # NIL, "cannot create temp file");
  RETURN fl;
END Temp;


BEGIN
  IF Kernel.hostOS IS Kernel.NixLikeOS THEN
    IF Kernel.LoadMod("System:Nix:Files") # 0 THEN
      HALT("cannot load host Files implementation");
    END IF
  ELSE HALT("no host 'Files' implementation for this OS");
  END IF
END System:Files.

как видно, я вдобавок нюкнул «тип файла». это бесполезный ошмёток макоси, где типы файлов были отдельными сущностями, а не расширениями.

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

впрочем, я всё равно не очень доволен: возможно, для оверлеев надо дополнительную механику. штука в том, что локаторы не знают, зачем их могут использовать. так что оверлей будет вынужден перехватывать всё, а дальше как-то создавать локаторы других драйверов по необходимости. возможно, имеет смысл сделать какой-то API, который позволит создать локаторы, используя «только драйверы после себя». хотя я `This()` не сделал лимитированым, так что оверлей может это реализовать самостоятельно. тут надо ещё подумать.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Четверг, 29 Август, 2024 12:36 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1562
поскольку шынапи — гуано, то пришлось сделать передачу untagged records by value (да, там зачем-то местами это есть). а вот вы пробовали найти описание того, как такое надо делать для x86 шынды? я попробовал. выяснил, что я очень тупой, и найти это не могу. какой-то анонимус где-то на днище интернетов говорит, что их просто поэлементно распаковывают в стек. надеюсь, оно именно так.

если смогу завести окно с opengl (пока что удалось показать message box) — может, кину шындодемку. бинарь, как полагается, будет с вирусами и майнером, потому что сейчас это модно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Четверг, 29 Август, 2024 21:39 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1562
удивительно, но окно с OpenGL даже завелось. правда, нет реализации System:Files, шадертой-обёртка не получается. в смысле — не хочу шадер вшивать, хочу с диска.

надо теперь сделать мини-sdl какой-нибудь, гыг. и как всё-таки шында неудобна с её колбэками…


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Пятница, 30 Август, 2024 05:40 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1562
хи. забавно. ребята в Halfmoon делают с LIR-кодом интересных гитик. например, граф доминаторов и dead store elimination делается уже по LIR. и чекер есть, который забытые `LIR_live` детектит. причём это зачем-то тоже сделано фильтрами LIR-кода.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Пятница, 30 Август, 2024 19:38 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1562
ну что, Время Пришло. шиндобинарь. вместе с батником "run_test.bat". должно появиться gl-окно с кросивым.

внутре, как полагается, вирусы, майнеры, трояны и исходники системы. а исходников компилятора нет, потому что я скурвился и делаю теперь проприетарщину.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Суббота, 31 Август, 2024 10:21 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1562
знаете, была однажды такая история. жил на свете мужик, слабых не обижал, другим помогал, щедрый был, умный — ну, во всём хорош. помер он, попал на тот свет, бог на него только глянул, и говорит: «а этого мудилу — отправить засраные очки драить. вечность!» «но за что?! — заплакал мужик — что я не так сделал?» а бог ему и отвечает: «а ты каментов не писал. мудила. иди теперь, драй очки.»


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Понедельник, 02 Сентябрь, 2024 00:09 

Зарегистрирован: Пятница, 13 Март, 2015 16:40
Сообщения: 625
arisu писал(а):
...вечность...

Три буковки как-бы лишние...
Ну и возникает вопрос: там, где всё нематериальное, на что вообще может влиять засранность-незасранность очк? ;-)

PS: а по поводу исходного посыла вопросов нет. Мужик должен был быть возвращён к жизни и приговорён к написанию (а вот и попробуй вспомнить что к чему) комментов ко всем своим исходникам. (((-8Ж


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Понедельник, 02 Сентябрь, 2024 09:48 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1562
так. акела промахнулся. я намекал на то, что 19 раз уже скачали, и никто ничего не откомментировал в теме.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Понедельник, 02 Сентябрь, 2024 09:57 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1562
алсо, странное дело. CreateWindowEx берёт — и обрезает заголовок окна. пишу «Hello!» — а получается только «Hel». SetWindowText тоже. нет, с компилером всё в порядке: MessageBox ничего не проглатывает.

звезда в шоке.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Понедельник, 02 Сентябрь, 2024 10:28 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1562
галя, отмена! когда крадёшь чужой код — то не забывай править `DefWindowProcW` на `DefWindowProc`.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Понедельник, 02 Сентябрь, 2024 15:08 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1562
портировал читалку пингов, и даже нарисовал пинг через OpenGL. вау.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Понедельник, 02 Сентябрь, 2024 20:40 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 485
Откуда: KZ
Код:
parsing complete in 0.0109 seconds (2,086,312 bytes alloced)
compiling complete in 0.0447 seconds
memory used: nodes/types: 3,663,269; code: 103,604/1,048,576; data: 52,436; names: 18,072; types: 16,817
store optimisations: 349 (0 immediates)
ERROR(<wtf?>:1:0): cannot open source file for module `System:Shitdoze:Dates`
ERROR(<wtf?>:1:0): cannot open source file for module `System:Shitdoze:Files`
parsing complete in 0.0173 seconds (6,930,285 bytes alloced)
compiling complete in 0.00248 seconds
memory used: nodes/types: 7,040,725; code: 104,404/1,048,576; data: 235,164; names: 18,072; types: 179,934
store optimisations: 4 (0 immediates)
WARNING: cannot load queued module `System:Shitdoze:Files`!
WARNING: cannot load queued module `System:Shitdoze:Dates`!
parsing complete in 0.000921 seconds (7,231,485 bytes alloced)
compiling complete in 0.00477 seconds
memory used: nodes/types: 7,297,749; code: 120,084/1,048,576; data: 239,180; names: 18,072; types: 180,961
store optimisations: 53 (0 immediates)
glx: failed to create dri3 screen
failed to load driver: nouveau
glx: failed to create dri3 screen
failed to load driver: nouveau
FATAL: shader program linking failed!
ERROR:
TRAP in module `test_sgl1`, line 224: OpenGL ERROR


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Вторник, 03 Сентябрь, 2024 05:08 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1562
да что ж у вас у всех не невидии с правильными дровами-то! ;-) шадертой требователен к OpenGL. самое смешное то, что на реальной шинде оно таки работает.

однако спасибо большое! выбор шадертоя был не лучшей идеей, я понял. ладно, для следующей демки сделаю что-нибудь на fixed pipeline. до Кросивого мир ещё не дорос. ;-)

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Вторник, 03 Сентябрь, 2024 20:29 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1562
серьёзно раздумываю над тем, не стоит ли сделать REAL 32-битным, и LONGREAL 64-битным. в подавляющем большинстве случаев 32-битных флоатов вполне достаточно. реально — достаточно для почти любых практических применений. единственное исключение — INTEGER туда не влазит, теряем точность. о чём можно написать в спеках (которые я точно-точно когда-нибудь сделаю!) — и пусть у программиста дальше голова болит.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Среда, 04 Сентябрь, 2024 22:42 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1562
блин. вот мучаешься-мучаешься с окнами вручную — а толку? нормального звукового API-то всё равно нет, всё равно SDL тащить. или OpenAL-soft. если бы она не умерла — была бы отличная библиотека. но к сожалению, автор сошёл с ума, начал её переписывать на крестах — после чего она перестала нормально собираться, а также нормально работать. а MojoAL хочет SDL чтобы звук выплёвывать. и у меня как-то нет настроения пилить к ней бэкэнды.

не, я могу, конечно, через алсу и винмм руками. но. тогда надо поддержку тредов пилить. а я треды не делал вполне сознательно. в частности ещё и потому, что: а) никакого нормального метода работать с TLS нет; б) никакого нормального метода запаузить и продолжить потоки нет. это всё решаемо, конечно — но в итоге куча геморроя для ничего. и везде адовые тормоза, потому что любая работа со строками через лочки пойдёт.

на самом деле процедуру-то можно и сейчас как поток запустить. но там не должно быть строк, не должно быть тэгнутых указателей, и не должно быть никаких вариантов трапнуться. то же самое относится ко всему дереву вызовов. компилятор это в принципе проверить не может (указатели на процедуры/методы, halting problem). малейшая ошибка — и вся система, сверкая спецэффектами, развалится на куски.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Четверг, 05 Сентябрь, 2024 00:33 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1562
да ну нафиг: OpenAL наше всё. я этот апи нежно люблю, я его хочу, я его буду. а руками с осями не хочу и не буду. иба ваистену.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Четверг, 05 Сентябрь, 2024 22:45 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1562
удивительное дело: оно всё работает и работает. нашёл одну ошибку в наножите (которую сам бережно туда и посадил), и одну в формировании карт указателей для массивов (забыл, что массив указателей нуждается в карте). мелочи, в принципе.

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

алсо, пришлось поступиться Твёрдыми Принципами, и ввести стандартные типы `BYTE`, `SBYTE`, `SHORTINT` и `SHORTUINT`. мне-то нафиг не надо, но делать бинды без них иногда неудобно. в выражениях они безусловно промоутятся до `INTEGER`.

очень хочется убрать рекурсию из анализа тела процедур, но никак нельзя. потому что этот анализ — в том числе — выясняет, pure или нет. надо знать, потому что резолвер операторов умеет pure-выражения выкидывать. ну, или запиливать промежуточный проход по всем операторам, тоже вариант. опять думать надо…


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Пятница, 06 Сентябрь, 2024 03:00 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1562
as i promoted `BYTE` to standard type, it's time to make the next step: `ARRAY OF CHAR` and `ARRAY OF BYTE` shold be compatible. i.e. the compiler should treat both types as the same for arguments.

let's face it: everybody's using arrays of chars as byte arrays. there is simply no reason to create arrays of chars for anything else (at least in O/Ur, where we have the distinct `STRING`type). so i implemented this feature.

and why Engrish, you may ask? just because it is fun. i hereby declare this day The Day of Broken Engrish!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Пятница, 06 Сентябрь, 2024 16:27 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1562
абстрактные размышления.

если вы заметили (ну, мало ли…) — в обероне довольно много процедур, которые возвращают некий результат через `VAR` или `OUT`. которые, в принципе, выглядели бы более логично как функции (то бишь, процедуры с результатом). на что есть довольно весомая причина.

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

однако люди, пришедшие с других языков (и я в том числе), или люди, которым это явно не озвучили, часто пишут функции с side effects. увы. и я тут несколько в раздумье: придерживаться ли строгого неписаного правила, или нет.

штука в том, что я довольно часто возвращаю некий «код успеха», который мне нужен далеко не всегда. в UP и O/Ur его можно игноровать, написав: `VOID:MyFunc(…);`. а если код возвращается через аргумент, то надо заводить мусорную переменную (в том же BBCB вы их — мусорных переменных — можете увидеть в количестве).

в принципе, это можно решить, добавив хак типа ключевого слова `IDC` — «i don't care». `MyProc(…, IDC);`. ну, или как-то так. по-моему, я даже делал в UP хак: переменная с именем `_` как раз это и обозначает. но всё-таки это хак.

с другой стороны — часто бывает удобно делать что-то типа `IF ~Action1(…) OR ~Action2(…) OR ~Action3(…) THEN Error; END IF`.

в общем, я никак не могу решить: прибить ли жёстко правило функций без побочных эффектов в весь API, или ну его. в частности, `file.Register()` — мне довольно часто результат не нужен, например: ну, не вышло — и не вышло. в основном это в throw-away utilities, конечно, но…


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 332 ]  На страницу Пред.  1 ... 6, 7, 8, 9, 10, 11, 12 ... 17  След.

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


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

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


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

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