macros

LaTeX3 no aplica los tipos de argumentos para las secuencias de control definidas por el usuario,¿por qué?

De una pregunta anterior , dice:

Los tipos de argumento N y n son los más comunes. Lo primero significa que el argumento debe ser un único token sin llaves , lo segundo significa que el argumento debe ser una lista de tokens entre llaves .

Esto está más o menos claro para mí,pero parece que la interfaz L3 no hace cumplir esto para las funciones definidas por el usuario,aquí hay un MWE:

\documentclass{article}

\begin{document}
    \ExplSyntaxOn
    \cs_new:Nn \myFunc:N {<<#1>>}
    \myFunc:N {test}
    \ExplSyntaxOff

\end{document}

El código anterior se compila bien, incluso si estoy pasando una lista de tokens reforzados para que funcione myFunc:N , que aparentemente está declarado para tomar estrictamente un único token no reforzado.

Esto hace que una gran parte de la capa de programación L3, es decir, las definiciones de funciones y las especificaciones de argumentos parezcan una mera convención sintáctica. suspiro _

¿Por qué no se aplican los tipos de argumentos a las funciones definidas por el usuario como cabría esperar?

Colons

Curiosamente, el compilador arroja un error cuando omito los dos puntos : , por ejemplo, si declaro una función myFunc en lugar de myFunc:N . Así que parece que se cumple...



La capa de programación expl3 todavía se basa en el lenguaje TeX y la búsqueda de argumentos está definida por las reglas de TeX.

Estas reglas solo distinguen entre argumentos delimitados y no delimitados . Y lo que expl3 llama "funciones" son en realidad macros regulares de TeX; las variables, dependiendo de su tipo, pueden ser macros o registros.

La función básica \cs_new:Nn para definir otras funciones solo trata con argumentos no delimitados . Toma dos argumentos: uno, un solo token, que debe ser un nombre válido para una función que incluye la firma; el segundo argumento debe ser una lista de tokens entre llaves.

La firma se utiliza para suministrar el texto del parámetro correcto para la macro subyacente que se va a definir,porque una declaración como

\cs_new:Nn \mymodule_foo:nn { #1 -- #2 }

eventually becomes

\def\mymodule_foo:nn #1#2{#1--#2}

(al igual que lo hace \newcommand ). Es posible definir funciones sin una firma en su nombre, pero generalmente no se recomienda: estos serían comandos a nivel de usuario y es mejor usar \NewDocumentCommand para ellos.

Por otro lado,si lo hace

\cs_new:Nn \mymodule_foo:N { --#1-- }

y luego llamar a

\mymodule_foo:N {text}

TeX seguirá sus propias reglas y aceptará el código sin quejarse, a pesar de que la codificación sea incorrecta desde el punto de vista de la expl3 .

¿Por qué no se impone que los argumentos se especifiquen de la manera adecuada en lo que se refiere a arriostrado o no arriostrado? Porque esto sería generalmente imposible y,en cualquier caso,introduciría una pesada sobrecarga en términos de velocidad y eficiencia.




En TeX - excepción: motores LuaTeX - no es posible mirar de manera expandible el siguiente token para verificar si es un token de carácter explícito de categoría 1 que denota un argumento de múltiples tokens, por ejemplo, una llave de apertura de categoría 1. Necesitaría usar algo como/basado en \futurelet , que es una asignación, lo que implica que la macro en cuestión no se pudo llevar a cabo en contextos de expansión como \write , \message , \csname..\endcsname , \edef , x / e / f / o -expansión etc.

Besides this:

¿Cómo "hacer cumplir", por ejemplo, x / e / f / o -type-arguments?

Cita de Wikipedia : "En la teoría de la computabilidad, el problema de la detención es el problema de determinar, a partir de una descripción de un programa de computadora arbitrario y una entrada, si el programa terminará de ejecutarse o continuará ejecutándose para siempre. Alan Turing demostró en 1936 que un algoritmo general para resolver el problema de detención para todos los posibles pares de programa-entrada no pueden existir " .

Algunos tokens de un argumento de tipo e pueden formar un programa de computadora basado en expansión; algunos otros tokens del argumento de tipo e pueden provenir de argumentos de macros de nivel de usuario que podrían considerarse la entrada para el programa de computadora. Por lo tanto, verificar/"hacer cumplir" un argumento de tipo e podría implicar idear una rutina bastante general para verificar si la expansión de los tokens que forman el argumento de tipo e , probablemente una combinación de programa de computadora basado en expansión y entrada para esa expansión -programa de computadora basado-termina en absoluto.

Tal vez esto no sea exactamente un caso del problema de encontrar un algoritmo general para que una máquina de Turing resuelva el problema de parada para todos los pares posibles de programa-entrada,pero esto me lo recuerda.

¿Cómo "hacer cumplir", por ejemplo, w -type-arguments?

¿Cómo "hacer cumplir", por ejemplo, argumentos de tipo T / F ?

Por cierto, no subestimes las convenciones sintácticas, pueden ser de gran ayuda en la depuración. ;-)

Puede definir macros/secuencias de control (a nivel de usuario) en las que no es necesario especificar la firma del argumento; solo use \cs_new:Npn o variantes del mismo. El argumento p -type denota texto de parámetro como con \def .