Re: Обозначения для спецсимволов


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