Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Удалить устаревшие функции Простого Рефала из Library(Ex) #58

Closed
14 tasks done
Mazdaywik opened this issue Aug 26, 2016 · 3 comments
Assignees
Labels

Comments

@Mazdaywik
Copy link
Member

Mazdaywik commented Aug 26, 2016

Цель

Предлагается избавиться от устаревших функций Простого Рефала (на букву F которые). Дублирующие — удалить, остальные переименовать.

Мотивация

Простой Рефал не нужен, ибо устарел. И избыточные функции в стандартной библиотеке тоже не нужны.

Задача

  • Удалить следующие функции:
    • FClose — дублирует Close.
    • FReadLine — дублирует Get.
    • FWriteLine — дублирует Putout.
    • ReadLine — дублирует Card.
    • WriteLine — дублирует Prout.
    • IntFromStr — частично дублирует Numb. В отличие от Numb производит элементы синтаксического анализа, но может отделить только одну макроцифру (что является артефактом Простого Рефала). Синтаксический анализ нужно проводить явно, поэтому функция IntFromStr не нужна.
    • FastIntFromStr — вызывает IntFromStr и падает, если не Success. Не нужна вместе с IntFromStr.
    • StrFromInt — дублирует Symb. Но сама функция Symb реализована через StrFromInt, поэтому пока достаточно удалить у неё $ENTRY.
    • Y — комбинатор неподвижной точки. Сложная и непонятная функция с неудобным интерфейсом для того, чтобы создавать рекурсивные безымянные функции. Я ей не пользуюсь, т.к. функция себя не оправдывает. Циклы по последовательности успешно реализуются Map, MapAccum, Reduce. Для циклов общего вида можно рассмотреть интерфейс вроде экспериментальных отсюда:
      https://gist.github.com/Mazdaywik/69a574565dc3e2904b6bbeb61e30c781
  • Переименовать следующие функции:
    • FOpen → Open-Auto. Отличия в именах Open и FOpen ничего не говорят о различии их семантики. Заманчиво, конечно, было бы переименовать Open в ReOpen, но нельзя — это встроенная функция Рефала-5.
    • FWriteBytes → WriteBytes. А вообще, она нужна? Ведь <Write s.File <Chr e.Bytes>> справляется не хуже. Оставим для симметрии с ReadBytes.
    • FReadBytesReadBytes.
    • MapReduceMapAccum, уже давно она deprecated и является синонимом для MapAccum, давно пора удалить.
    • SeqPipe. Аналогично MapReduce.
  • Не трогаем:
    • SymbCompare — эффективная функция для сравнения символов, эмулировать её при помощи Compare громоздко и медленно.
    • FTell, FSeek — лучше имена не придумаешь. Tell и Seek выглядят не так понятно, FileSeek, FileTell — громоздко.
    • RenameFile — симметрична RemoveFile.
Старая постановка задачи

Предлагается следующий пакет изменений.

  • Стандартная библиотека пополняется функциями DebugDump и DebugDump-T, которые выводят объектное выражение в файловый поток (включая #STDOUT и #STDERR, см. далее) в виде однозначного дампа. Их реализация просто вызывает refalrts::debug_print_expr.

  • Библиотечные функции WriteLine и FWriteLine смогут печатать только потоки char’ов: будут падать на выражениях, содержащих что-либо ещё.

  • В качестве файловых дескрипторов для библиотечных функций FWriteLine и FReadLine можно будет передавать идентификаторы #STDIN, #STDOUT, #STDERR #stdin, #stdout, #stderr. Функции LoadFile и SaveFile будут получать первым параметром t.FileTarget:

    t.FileTarget ::= s.ExFileHandle | (e.FileName)
    s.ExFileHandle ::= s.FileHandle | #STDIN | #STDOUT | #STDERR
    

    Если функция первым параметром получает дескриптор, то она, соответственно, читает или пишет строки, но не закрывает его в конце.

  • Функции FWriteLine и FReadLine не возвращают файловый дескриптор.

  • Для вывода объектных выражений в читабельном виде в LibraryEx будут предусмотрены функции WriteExpr, FWriteExpr, SaveFile-Expr, StrFromExpr, в Library — StrFromAtom. Последняя функция похожа на StrFromInt, формирует текстовое представление атома. Функция StrFromExpr, реализованная через StrFromAtom, выводит выражение по следующим правилам:

    • Идентификаторы и указатели на глобальные функции выводятся просто как их имена (как печатает их сейчас WriteLine).
    • Числа выводятся в десятичном виде.
    • Замыкания выводятся в виде Имя\…[N], где N — количество ссылок на функцию. Содержимое замыкания не печатается.
    • Файлы выводятся как *XXXX…XX, где X — шестнадцатеричная цифра.
    • Выражение в круглых скобках выписывается в круглых скобках.
    • Выражение в квадратных скобках выписывается как [ADT], т. е. его содержимое не печатается.
    • Между двумя элементами из набора {идентификатор, функция (любая), число, файл, АДТ, круглая скобка} ставится пробел. При этом пробел не ставится между двумя одинаковыми скобками и внутри группы пустых скобок.
@Mazdaywik Mazdaywik added the task label Aug 26, 2016
@Mazdaywik Mazdaywik self-assigned this Aug 26, 2016
@Mazdaywik Mazdaywik added this to the Рефал-5λ milestone Sep 25, 2016
@Mazdaywik
Copy link
Member Author

Mazdaywik commented Sep 25, 2016

Если незначительно изменить формат StrFromExpr, то функции вывода будут совместимы с функциями Print, Prout, Put и Putout РЕФАЛа-5 (и, соответственно, Рефала-5λ). Поэтому данная задача включается в соответствующую веху.

Комментарий к старой постановке задачи.

@Mazdaywik
Copy link
Member Author

Mazdaywik commented Nov 24, 2017

Цели уже реализованной задачи #130 конфликтовали с этой задачей, поэтому формулировка несколько устарела. Частично конфликты я разрешил тем, что вычеркнул неактуальный пункт. В остальном задача интересна и пусть остаётся.

Комментарий к старой постановке задачи.

Mazdaywik added a commit that referenced this issue Apr 6, 2020
Они псевдонимы соответственно для Open-Auto, WriteBytes, ReadBytes.
Mazdaywik added a commit that referenced this issue Apr 10, 2020
Вызовы заменены на Close. Функция Close, конечно, не реагирует
на некорректные дескрипторы, но это не важно.
Mazdaywik added a commit that referenced this issue Apr 10, 2020
Функция cookie_ns::close(), которая вызывалась и из Close, и из FClose,
больше не нужна — её тело упрощено и встроено в Close.

Коммит удобно смотреть с игнорированием пробелов.
Mazdaywik added a commit that referenced this issue Apr 10, 2020
Для единообразия переименованы вхождения и в тех автотестах, где они никакой
роли в принципе не играют. Аналогично, для примеров раскраски синтаксиса.

Тесты для функции ReadLine → Card сохранены, поскольку они нагляднее
теста в папке autotests/compatibility.

Тест Library-WriteLine.sref после замены в нём WriteLine → Prout ничего
нового не даёт по сравнению с тестом в compatibility. Напротив, тест
Library-Prout-Expr.sref проверяет корректность вывода квадратных скобок
и замыканий, чего в тестах совместимости быть не может.
@Mazdaywik Mazdaywik changed the title Функции ввода/вывода в Library(Ex) Удалить устаревшие функции Простого Рефала из Library(Ex) Apr 10, 2020
@Mazdaywik
Copy link
Member Author

Тема уточнена, чтобы соответствовать постановке задачи. Тем более, что в постановке задачи фигурируют не только функции ввода-вывода.

Mazdaywik added a commit that referenced this issue Apr 11, 2020
Простой Рефал не проверяет переполнение в целочисленных литералах,
поэтому нельзя просто заменить FastIntFromStr на Symb. Нужно учесть
особенность поведения IntFromStr при переполнении.
Mazdaywik added a commit that referenced this issue Apr 11, 2020
Пришлось написать элементы синтаксического разбора в двух точках
её использования: compiler/Config.ref и lexgen/DFA-Lexer.ref.

Удаление из Library.ref формальное — нужно будет провести рефакторинг.
Mazdaywik added a commit that referenced this issue Apr 11, 2020
Теперь вхождения строки StrFromInt встречаются только в исторической
документации.

Для единообразия переименованы вхождения в opt-pattern{2,4}.sref.

В реализации Library.ref эта функция используется, поэтому была
переименована в более адекватную StrFromMacroDigit.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant