
Как остановить выполнение остальной части кода функцией, если в latex3 выполняются некоторые условия?
Теперь мне нужно построить вложенные условия и продублировать пару случаев по умолчанию. Читаемость кода ухудшается, если случай по умолчанию довольно большой.
\ExplSyntaxOn
\cs_set:Npn \my_func #1 {
\token_if_cs:NTF #1 {
\str_eq:nnTF {#1} {\\} {
first case
}{
\token_if_expandable:NTF #1 {
second case
}{
default
}
}
}{
default
}
}
\my_func{\\}
\ExplSyntaxOff
Вот что я хотел бы иметь в плане языка программирования
function(arg){
if(condition 1){
return <first case>;
}
if(condition 2){
return <second case>;
}
return <default case>;
}
решение1
Есть несколько способов добиться этого. Я бы, скорее всего, использовал подход на основе предикатов и ленивую оценку:
\ExplSyntaxOn
\cs_set:Npn \my_func:N #1
{
\bool_lazy_and:nnTF
{ \token_if_cs_p:N #1 }
{ \token_if_expandable_p:N #1 }
{
\str_if_eq:nnTF {#1} { \\ }
{ first case }
{ second case }
}
{ default }
}
\my_func:N { \\ }
\ExplSyntaxOff
В более сложных случаях я обычно помещаю «полезную нагрузку» (действия) во вспомогательные функции.
Если вы привязаны к формату «возврат», вам нужен какой-то маркер конца.
\cs_set:Npn \my_func:N #1
{
\token_if_cs:NF #1
{ \__my_func_return:nw { not-a-cs } }
\token_if_expandable:NF #1
{ \__my_func_return:nw { not-expandable } }
\__my_func_return:nw { default }
\__my_func_end:
}
\cs_new_eq:NN \__my_func_end: \prg_do_nothing:
\cs_new:Npn \__my_func_return:nw #1#2 \__my_func_end:
{#1}
но, честно говоря, я бы остановился на предикатах и соответствующих вспомогательных глаголах.