Как в контекстах расширения наверняка узнать момент, когда получен результат полностью расширяемой функции expl3?

Как в контекстах расширения наверняка узнать момент, когда получен результат полностью расширяемой функции expl3?

Среда программирования expl3 предоставляет множество функций, которые в interface3.pdf отмечены черной звездочкой (полностью расширяемые) или белой звездочкой (ограниченно расширяемые).

Почему так много функций помечены как полностью расширяемые, но при этом не предоставляется официальная информация о количестве расширений, необходимых для получения результата?

Ну, с некоторыми полностью расширяемыми хвостовыми рекурсивными вещами, где средства управления расширением, такие как \exp:w/, \exp_end:не применяются в реализации, и количество рекурсий, и количество расширений, необходимых для получения результата, зависят от аргументов, предоставленных пользователями. Поэтому точная информация о количестве расширений, необходимых для получения результата, не может быть предоставлена ​​там.

Однако существует множество функций, где это не так и где можно было бы предоставить точную информацию о количестве расширений, необходимых для получения результата.

Как, имея такие полностью расширяемые функции expl3, можно точно знать в контексте расширения момент, когда результат получен?

Например, я хотел бы узнать количество расширений, которые необходимо запустить для получения результата \str_tail:n.

В контекстах расширения вы не можете использовать x-expansion, так как он сам по себе не расширяем.
Вы не можете безопасно просто использовать f-expansion, так как это может удалить еще один начальный пробел из строки.
Если полностью расширяемая функция, о которой идет речь, не была \str_tail:nчем-то, где сами аргументы не являются строками нерасширяемых явных символьных токенов, то e-expansion может вызвать большее расширение, чем требуется. Кроме того, с движками, где -primitive \expandedнедоступен, e-expansion является дорогостоящим.

В этом случае \str_tail:nможно было бы заглянуть в source3.pdf и выяснить, что в текущей реализации необходимы четыре расширения:

\cs_new:Npn \str_tail:n #1
  {
    \exp_after:wN \__str_tail_auxi:w
    \reverse_if:N \if_charcode:w
    \scan_stop: \tl_to_str:n {#1} X X \s__str_stop
  }
\cs_new:Npn \__str_tail_auxi:w #1 X #2 \s__str_stop { \fi: #1 }

Расширение 1 возвращает вам текст замены \str_tail:n.
Расширение 2 выполняет -штуку, которая заканчивается, когда оценивается \exp_after:wNрезультат -теста , и таким образом первый токен строки используется как аргумент для сравнения его кода категории с кодом категории . Расширение 3 расширяет , который добавляется для сопоставления и сохраняет аргумент с разделителем category-11- и удаляет аргумент с разделителем. Расширение 4 удаляет .\if_charcode:w\scan_stop:
\__str_tail_auxi:w\fi:\if_charcode:wX\s__str_stop
\fi:

Однако просмотр source3.pdf не является способом получения информации об официальных подробностях реализации.

\str_tail:nВ случае изменения внутренней реализации может измениться и количество расширений, необходимых для получения результата .

Я не вижу общего метода с полностью расширяемой функцией, который бы гарантировал, что вы получите правильный момент для окружения некоторыми другими токенами токенов, которые формируют результат этой функции, кроме как зная количество расширений, после которых результат функции будет там.
При использовании \exp:wдля запуска расширения полностью расширяемой функции, предоставляемой средой программирования expl3, до тех пор, пока не будет результата этой функции, я не вижу общего метода, который бы гарантировал, что \exp_end:выполняется в правильный момент времени для остановки \exp:w-expansion, который может обойтись без знания количества расширений, после которых будет результат этой функции.

Поэтому я считаю, что при наличии полностью расширяемых функций эта информация должна быть предоставлена ​​в качестве официальной.

Сколько расширений необходимо до результата функций \exp_args:...или \use_i:nnесть ли?
Эта информация официально не предоставлена ​​в interface3.pdf.
Могу ли я спокойно положиться, например, на то, что \use_i:nnвсегда требуется ровно одно расширение, без чьих-либо жалоб, потому что я вывожу информацию из внутренних деталей реализации, а не полагаюсь только на факты, которые официально задокументированы?
Что должно заставить меня полагаться на согласованность между выпусками expl3 в аспектах, которые официально не документированы?
(Дистрибутив LaTeX, который идет вместе с моим дистрибутивом Linux, так сильно отличается от TeX Live 2024... )

решение1

Ситуация с документацией является намеренной. Существует очень мало (низкоуровневых) функций, где количество расширений важно, и где команда или другие должны знать/полагаться на это: они документированы. В других случаях использование расширения типа e- или - fобычно достаточно. Например,\str_tail:n обязательносоздает строку - поэтому это безопасно вe контексте -типа, поэтому естьнезачемдля документирования необходимого количества расширений.

В более общем смысле, если функция принимаетдокументтокенов, то вы не можете использовать eрасширение -type, но в целом придерживайтесь, \protected@edefтак как это работает с надежными командами LaTeX2e - expl3обычно не делает этого. Для чистого текста \text_expand:nделает что-то похожее, \protected@edefно не работает хорошо с нетекстовым расширением. В любом случае, эти подходы позволяют расширять expl3функции, сохраняя хрупкий материал LaTeX2e (например, \textbfили подобный).

Документирование количества требуемых расширений накладывает ограничение на любые изменения кода: насколько это возможно, мы этого не делаем — ограничения касаются только тех, которые являются частью API. Если у вас есть четкий вариант использования, который, как кажется, требует такой стабильности API, зарегистрируйте проблему и попросите изменить (документацию).

Связанный контент