함수 반환 — expl3

함수 반환 — expl3

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

더 복잡한 경우에는 일반적으로 '페이로드'(액션)를 보조 장치에 넣습니다.


'return' 형식에 얽매인 경우 종료 마커 토큰이 필요합니다.

\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}

그러나 솔직히 나는 술어와 적절한 보조어를 고수할 것입니다.

관련 정보