Problemas al analizar el nombre del archivo en expl3

Problemas al analizar el nombre del archivo en expl3

Estoy intentando analizar la extensión de archivo de una ruta proporcionada por el usuario en expl3. Tengo la extensión de archivo, pero no puedo compararla con la extensión de archivo esperada. Mi MWE es

\documentclass[]{article}
\usepackage{expl3}
\usepackage{xparse}

\ExplSyntaxOn
\ior_new:N \g_slo_input_stream_ior
\tl_new:N \l_slo_input_dir_tl
\tl_new:N \l_slo_input_base_tl
\tl_new:N \l_slo_input_ext_tl
\cs_generate_variant:Nn \tl_if_eq:nnTF { V }

\cs_new:Nn \slo_open_file:n {
    \file_parse_full_name:nNNN { #1 } \l_slo_input_dir_tl \l_slo_input_base_tl \l_slo_input_ext_tl

    \tl_if_eq:VnTF \l_slo_input_ext_tl { .abc } { 
        #1~is~.abc-file.
    } { 
        #1~is~\l_slo_input_ext_tl-file,~expected~.abc-file.
    }
}
\NewDocumentCommand { \abcfile } { m } { \slo_open_file:n { #1 } }
\ExplSyntaxOff

\begin{document}
    \abcfile{example.test} \par
    \abcfile{filename.abc}
\end{document}

que produce

example.test is .test-file, expected .abc-file.
filename.abc is .abc-file, expected .abc-file.

mientras esperaba

example.test is .test-file, expected .abc-file.
filename.abc is .abc-file

Según tengo entendido, la comparación \tl_if_eqfalla. ¿Por qué?

Respuesta1

Como está documentado, \file_parse_full_name:nNNNproporciona los valores 'retur' como cadenas, no como listas de tokens. Es decir, todos los caracteres tienen el código de categoría 12 ('otros'), espacios de barra que son el código de categoría 10 ('espacio'). La tlcomparación verifica los tokens, por lo que aquí los códigos de categoría son importantes. Su literal ' .abc' tiene el código de categoría 11 ("letra") abc, por lo que la prueba falla.

La mayoría de las veces, y ciertamente aquí, probablemente sea mejor utilizar las pruebas basadas en cadenas para verificar el "texto". Esto solo analiza los códigos de caracteres, por lo que no tenemos que preocuparnos por el negocio de los códigos de categoría.

\cs_new_protected:Npn \slo_open_file:n #1
  {
    \file_parse_full_name:nNNN {#1}
      \l__slo_input_dir_tl
      \l__slo_input_base_tl
      \l__slo_input_ext_tl
    \str_if_eq:VnTF \l__slo_input_ext_tl { .abc }
      { #1 ~is~.abc~file. }
      { #1~is~\l__slo_input_ext_tl-file,~expected~.abc-file. }
  }

información relacionada