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