Subject: Re: Обозначения для спецсимволов
From: Sergei M. Abramov (at home) (abram@botik.ru)
Date: Sat Feb 10 2001 - 15:57:27 MSK
День добрый, всем!
Хотя вопрос вроде как "по Рефалу-5", но и не совсем.
Посему, позволю себе реплику:
>Вопрос состоит в следующем. Есть ли в Рефале-5 способ обозначить
>специальные терминальные символы, а именно - символ табуляции, символ
>возврата каретки, символ BELL и прочие? Есть ли какой-нибудь аналог для
                                         *******************************
>\n, \t, \r, \g и прочих обозначений языка C...
 **********************************************
>Собственно, меня интересует две стороны проблемы. Первая - есть ли такой
>способ в той версии Рефала-5, которая доступна на сайте (именно эту версию
>я пытаюсь использовать).
> .... Вторая - каков должен был бы быть такой способ,
>если бы мир был идеальным ;-) (безотносительно того, есть ли такой способ
 *************************
>на самом деле).
Про Рефал-5 не скажу, а в документации по Рефалу Плюс:
# 3.4.СИМВОЛЫ-ЛИТЕРЫ
...
#      Символ-литера соответствует одной литере кода ASCII и запи-
# сывается в виде изображения этой литеры  ASCII,  заключенного  в
# апострофы. Например:     'A' 'a' '7' '$'
#      Как правило, изображением литеры ASCII  является  сама  эта
# литера, за исключением следующих литер ASCII, для которых  пред-
# усмотрены особые обозначения:
#
#      Новая строка (перевод строки) HL (LF)   '\n'
#      Горизонтальная табуляция      HT        '\t'
#      Вертикальная табуляция        VT        '\v'
#      Возврат на шаг                BS        '\b'
#      Возврат каретки               CR        '\r'
#      Перевод формата               FF        '\f'
#      Обратная косая                \         '\\'
#      Апостроф                      '         '\''
#      Двойная кавычка               "         '\"'
Еще может показаться интересным такое:
#     ДОПОЛНИТЕЛЬНЫЕ ВОЗМОЖНОСТИ РЕФАЛА ПЛЮС
...
#     ЗАПИСЬ ЧИСЕЛ И ЛИТЕР В ШЕСТНАДЦАТИРИЧНОЙ СИСТЕМЕ
#
#     Неотрицательные целые числа можно записывать в виде
#           0xZZZ...ZZ
# где ZZZ...ZZ  -  непустая  последовательность
# шестнадцатиричных цифр.
#     Например, 0xFF и 0xff эквивалентны 255.
#     Изображения литер, входящие в изображения цепочек символов-
# литер и символов-слов, могут записываться в виде
#          \xZZ
# где ZZ - две шестнадцатиричные цифры, задающие ASCII-код литеры.
> ... Вторая - каков должен был бы быть такой способ,
>если бы мир был идеальным ;-) (безотносительно того, есть ли такой способ
>на самом деле).
Ох какой хороший вопрос!  Так вот, была огромная дискуссия как в рефалах (5, 6,
Плюс) писать литеры в цепочках литер и литеры в словах (в составных символах).
Очень даже поучительная и интересная была дискусия.  Развесистая
дискуссия---даже уникод припоминали!.
Так вот, из мэйл-архива эта дискуссия кем-то убрана (архиватором по
давности?)...  Увы!
>Заодно, уж раз собрался написать, хотелось бы задать еще один вопрос
>знатокам Рефала. Насколько я понял, в Рефале-5 отсутствует то, что
>когда-то называлось, если не ошибаюсь, спецификаторами (например, для
>S-переменной можно было указать диапазон символов, которые она может
>match'ить).
Да, не только для S, но и для T и E, не только диапазон, но и другие
спецификации.
Да, в Рефале-2 был хороший большой язык описания спецификаторов на _термы_.  Все
было сделано (примерно) вот так:
=1= были элементарные спецификаторы на термы (вида: конечное множество символов,
выраж. в скобках, число, указатель, "произвольный терм" и т.п.);
=2= и были выражения, позволяющие из уже построенных спецификаторов строить
новые спецификаторы (ну, вроде как: объединение / пересечение / разность
спецификаторов есть спецификатор).  В точности деталей не опомню, но идея ясна.
>Исчезновение спецификаторов лично мне понравилось (на мой
>взгляд, язык стал стройнее), и некоторые догадки о причине такого
>исчезновения у меня есть.
Да, конечно, Ваша догадка правильная ;-)
Основная причина вымирания понятия: в новых рефалах (с большим или меньшим
удобством) строе понятие спецификатора можно выразить средствами языка.
Например, если на рефале написана функция <Is-Identifier e.X>, которая
проверяет, что еX есть непустая цепочка литер (начинающаяся с буквы и содержащее
букву и/или цифру) и которая возвращает True или False, то можно написать
цепочку перестроек:
    ... е1 : е2 еId e3, <Is-Identifier eId> : True, ...и далее...
Если интересно, в Рефале Плюс эти средства еще более развиты:
****************************************************
=1= введены "предикатные функции" (откатные функции)
****************************************************
То есть введена возможность вернуть из функции не только обычный результат, но и
результат $fail, где $fail -- ровно тот результат, с которым завершается,
например, такая перестройка (клэш):
                    А : В
теперь в Рефале Плюс мы можем писать функции:
    -- которые проверяют некий спецификатор (возвращают пусто или $fail);
или так (для парсеров всяких удобно)
    -- которые "отъедают" от строки некую конструкцию (если удается) или говорят
о неудаче $fail.
Общепринято имена таких функций завершать знаком "?".
Вышеприведенный пример:
    ... е1 : е2 еId e3, <Is-Identifier? eId>, ...и далее...
Или такой пример "цепочки перестроек" (клэшей):
   ...
   <SkipBlanks e0>  :: e1,
   <Identifier? e1> :: (eId1) e2, /* удалось отгрысть имя1 */
   <SkipBlanks e3>  :: e4,
   e4 : '+' e5,
   <SkipBlanks e5>  :: e6,
   <Identifier? e6> :: (eId2) e7 /* удалось отгрысть имя2 */
   = (Sum (Name e.Id1) (Name e.Id2)) <Parser e7> ;
****************************************************
=2= Есть библиотечные "предикатные" функции для
элементарных спецификаторов (классов) символов:
****************************************************
# 6.CLASS: ПРЕДИКАТЫ ДЛЯ РАСПОЗНАВАНИЯ КЛАССОВ СИМВОЛОВ
#
# $func? BOX?     e.Exp = ;
# $func? CHANNEL? e.Exp = ;
# $func? CHAR?    e.Exp = ;
# $func? DIGIT?   e.Exp = ;
# $func? FUNC?    e.Exp = ;
# $func? INT?     e.Exp = ;
# $func? LETTER?  e.Exp = ;
# $func? STRING?  e.Exp = ;
# $func? TABLE?   e.Exp = ;
# $func? VECTOR?  e.Exp = ;
# $func? WORD?    e.Exp = ;
#
#   Эти функции служат для проверки, что e.Exp является  симво-
# лом, принадлежащим к определенному множеству символов.
...
То есть, мы уже имеем в языке "элементарные спецификаторы".  В добавок к этому,
в Рефале Плюс сделано вот что:
****************************************************
=3= В языке введена "полная" система для
комбинирования "спецификаторов".
****************************************************
Ясно, что если Вы имеете:
        ...спецификатор-1...  (например: s1 : 'A')
и
        ...спецификатор-2...   (например: s1 : 'B')
то Вы можете захотеть записать "И", "ИЛИ" и "НЕ" над спецификаторами.  В Рефале
Плюс это легко сделать.
А именно:
*****************
"И" == пересечене
*****************
    Это просто "запятая":
    ...ранее...,
        ...спецификатор-1...,
        ...спецификатор-2...,
            ...далее...
Например:
    ...ранее...
        s1 : 'A',
        s1 : 'В',
            ...далее...
********************
"ИЛИ" == объединение
********************
    Это две ветки (кажется в Рефале-5 так нельзя--надо завести вспомог.функцию.
Зато в Рефале-6 и Плюс--так можно):
    ...ранее...,
        \{    ...спецификатор-1...;
              ...спецификатор-2...;
        \},
        ...далее...
Например:
    ...ранее...
        \{  s1 : 'A';
            s1 : 'В';
        \},
        ...далее...
********************
"НЕ" == дополнение
********************
    Это явная конструкция (#) отрицания "предиката" в Рефале-Плюс:
    ...ранее...,
        # ...спецификатор-1...,
        ...далее...
Например:
    ...ранее...
        #<LETTER? s1>,
        ...далее...
или
    ...ранее...
        # \{ s1 : 'A', ;\}
        ...далее...
>Тем не менее, не мог бы кто-нибудь из знатоков
>поделиться своим мнением на этот счет...
Выше вот такое мое мнение: старые спецификаторы ушли со сцены >>>в том числе<<<
потому, что современные диалекты Рефала позволяют легко писать "спецификаторы"
на самом Рефале и пользовать их в "левых частях" свободно и даже слишком
свободно.
Удачи
Сергей
П.С.
=1= Про эффективность "новых спецификаторов" по сравнению со старыми не говорил.
=2= Старые спецификаторы ушли со сцены...  Не пора ли им вернуться?  (Это так...
просто вопрос...)
This archive was generated by hypermail 2b25 : Mon Oct 25 2004 - 21:24:58 MSD