-
Notifications
You must be signed in to change notification settings - Fork 35
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
Вставки кода на C++ #11
Comments
Фактически, изменилось только оформление. Принципиально не трогал код, поскольку для этого есть другая задача, «Рефакторинг Library» (#10).
В постановке задачи предполагалось, что во вставке кода будут доступны только имена функций и идентификаторов, определённые выше по тексту. Но, с учётом того, что язык поддерживает свободный порядок функций и идентификаторов (#7), в реализации получилось, что доступны все имена, как выше, так и ниже по тексту. А именно, директивы Если в исходном тексте присутствуют вставки верхнего уровня, то в ней может быть определена функция. Чтобы сообщить коду на Рефале, что там есть функция, следует использовать директивы Кстати, таким образом, директива При наличии вставки любого вида для идентификаторов, определённых через Помимо этого, библиотечный модуль P.S. При применении старого коммита для задачи #46 и разрешения конфликтов, оказалось, что фиксация вносит минимальные изменения в |
На текущий момент компоненты программы на Простом Рефале можно писать либо на Рефале, либо на C++. Это может быть довольно жёстким ограничением: когда требуется написать компонент, требующий как логику на Рефале, так и обращение к низкоуровневым средствам C++, приходится его искусственно разбивать на два компонента.
Другой сценарий: в ходе развития компонента, изначально написанного на чистом C++ (такого, как стандартная библиотека
Library
) может так оказаться, что некоторые функции разумнее выразить на Рефале как комбинацию более низкоуровневых компонент. В рамках текущей парадигмы или придётся разбивать компонент на два, или вставлять в него фрагмент скомпилированного кода.Также, написание компонентов целиком на C++ имеет высокую акцидентную сложность (в терминологии Брукса). Если функция использует такие примитивные объекты как метки и пустые функции (можно добавить и статические ящики, но так обычно не пишут), то их приходится вручную описывать на языке C++. Недавняя попытка перейти от хранения в узлах списка пары указателей (указатель на функцию и указатель на строку — имя функции) к хранению указателя на дескриптор функции (константную статическую структуру, содержащую указатель на функцию и строку символов) потребовала много тупой шаблонной работы (upd: #46).
Предлагаемый синтаксис: вставка кода на C++ оформляется как фрагмент кода между двумя строками вида
%%
. Вставки допустимы как на верхнем уровне программы между глобальными объявлениями, так и в качестве тела функции между фигурными скобками. Предполагается, что внутри вставки можно использовать все имена, объявленные/определённые выше по тексту, при этом во вставке, описывающей имя функции также доступны две переменныеrefalrts::Iter arg_begin
иrefalrts::Iter arg_end
, хранящие указатели на угловые скобки вызова функции.Пример:
Аргументы за:
Аргументы против:
Субъективно, аргументы «за» перевешивают.
The text was updated successfully, but these errors were encountered: