OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 27 Ноябрь, 2021 05:32

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




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
СообщениеДобавлено: Понедельник, 04 Октябрь, 2021 01:12 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1375
Возможно, скоро попробую добавить в ЯОС литералы UTF-32. Это такая штука, которая является не массивом CHAR, а массивом из 32-разрядных чисел, каждое из которых кодирует одну "code point". Поэтому будет два вида строковых литералов:

Код:
конст a = "фыва" (* это литерал в формате UTF-8, т.е. он в памяти представлен как последовательность байт, каждая русская буква занимает два байта *)
b = UCS32.Lit("фыва") (* это литерал в формате UTF-32, т.е. массив из 4 32-разрядных чисел *)

Сейчас, собственно, есть функция UCS32.Lit, которая возвращает на самом деле указатель на массив таких чисел. Но хочу переделать её в конструкцию языка. Что будет наиболее "обероновым" стилем оформления такой конструкции? Я не особо хочу делать всякие там u"фыва". Например, по той причине, что дальнейший анализ того, какие могут быть литералы, показывает, что в развитом языке может быть много разновидностей, например, в C++ всё выглядит мрачным.

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


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

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 518
Вы пишете: "Поэтому будет два вида строковых литералов". Неочевидно, что два вида литералов в языке подразумевают, что они должны синтаксически или иначе различаться.

В КП литерные типы определяются вот так:
2. SHORTCHAR the characters of the Latin‘1 character set (0X .. 0FFX)
3. CHAR the characters of the Unicode character set (0X .. 0FFFFX)

Тип строкового литерала определяется по его содержимому: если все литеры строки входят в Latin1, то это литерал типа Shortstring (п. 6.6). А далее допускаются неявные преобразования:

Код:
CONST shortstring = 'Make it as simple as possible';
   string = "В Севилье град крупнее, говорят";
VAR ss: ARRAY N OF SHORTCHAR;
   s: ARRAY OF CHAR;
BEGIN
   s := shortstring;  (* неявное приведение типа, СР2 "вписывает" его во время исполнения программы, хотя Сообщение о языке к этому не обязывает и позволяет сделать приведение во время компиляции *)
   ss := shortstring;
   s := string;
   ss := string;   (* недопустимо *)


Таким образом, в КП отсутствует необходимость явно указывать тип литерала; фактически, он выводится (собсно об этом в СЯ и сказано в других терминах). Как вам такой подход?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 04 Октябрь, 2021 12:16 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1375
Не, так не пойдёт, потому что у меня есть процедуры, которым на вход нужен UTF8 (например, ввод-вывод текстовых потоков), а есть - которым нужен UTF32 (например, текстовый редактор), это зависит от места применения, а не от содержания текста. В частности, парсер для редактора требует UTF32, и сейчас в нём конструируется море литералов в UTF-8 (таблица ключевых слов и встроенных функций), которые потом функциями преобразуются к UTF32, с лишней нагрузкой на кучу.


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

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 518
budden писал(а):
Не, так не пойдёт, потому что у меня есть процедуры, которым на вход нужен UTF8, а есть - которым нужен UTF32

А приведите, пож, пример заголовков процедур.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 04 Октябрь, 2021 21:36 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1375
https://github.com/metacore/A2OS/blob/m ... s.Mod#L237 - вот пример из модуля Texts.

А вот определение типа Char32 в этом модуле:
https://github.com/metacore/A2OS/blob/m ... ts.Mod#L26

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

https://gitlab.com/budden/ja-o-s/-/blob/главная/source/UCS32.Mod#L15


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 05 Октябрь, 2021 11:25 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 518
Я посмотрел по ссылкам, но не очень понял. Что такое UCS32String мне непонятно.

Зато я другое понял: то, что сделано в КП, реализуется компилятором. И, во-вторых, CHAR это не просто два байта, это всегда одна заданная кодировка. Если же определить CHAR просто как двухбайтную (четырехбайтную) литеру, без уточнения кодировки, то потом возникает неоднозначность в том, что такое ARRAY OF CHAR, в какой кодировке строка внутри этого массива. И тогда компилятору нужды дополнительные указания, как осуществить str := "Keep it simple".

А вы, я вспомнил, не трогаете компилятор, верно? Значит, вам такой подход не подходит.


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

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1375
Как раз в этом месте компилятор придётся потрогать. Да, у строкового литерала есть нюансы:

- какой он кодировки
- сколько байт в символе
- как воспринимать находящиеся внутри литерала спецзнаки, например \n
- однострочный/многострочный
- обрезать ли начало строк в многострочном для красоты и если да, то как именно

UCS32String - это ARRAY OF SIGNED32 или что-нибудь в этом роде.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

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


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

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


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

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