La &
metafunción (especificación alternativa de entrada / salida)
La forma tradicional de especificar el número de argumentos de entrada para pasar a una función es usar la $
metafunción
2$: % Two-input version of :
Del mismo modo, para especificar el número de argumentos de salida, puede usar la #
metafunción que especifica el número de argumentos de salida,
2#S % Two-output version of sort
o si pasa un número que es mayor que el número de argumentos de salida definidos para una función, solomod(N, numberOfOutputs) + 1
se proporciona el resultado.
4#S % Get only the second output of sort
También puede especificar una matriz lógica como entrada #
para recuperar solo argumentos de salida específicos.
TFT#u % Three output version of unique and discard the second output
Todas estas especificaciones de entrada / salida son útiles, pero aumentan su recuento de bytes muy rápidamente. Para lidiar con esto, MATL introdujo &
la metafunción en la versión 17.0.0 . Esta &
metafunción actúa como un acceso directo para una especificación de entrada o salida particular para una función. Veamos qué significa eso.
En nuestro ejemplo anterior, queríamos usar la versión de dos entradas de :
(crea un vector de valores equidistantes). Si bien el número predeterminado de argumentos de entrada :
es 1
(crea una matriz a partir de [1...N]
), es muy común que un usuario desee especificar el valor inicial del rango que requiere la segunda entrada. Entonces :
, hemos definido &
como un atajo para 2$
.
10 % Push 10 to the stack
12 % Push 12 to the stack
2$: % Create an array: [10, 11, 12]
Ahora se convierte en lo siguiente, ¡ guardando un byte !
10 12 &:
¿Cómo podemos determinar cuál es el número alternativo de argumentos?
La especificación de entrada / salida a la que se &
traduce es específica de la función, de modo que optimizamos el ahorro de bytes.
La sección de argumento de entrada / salida de la descripción de ayuda para cada función se ha actualizado para indicar cuál es este número alternativo de entradas / salidas (si corresponde). El número posible de argumentos de entrada o salida se muestra como un rango y los valores predeterminados para cada uno se muestran entre paréntesis. La especificación de entrada / salida con la que se puede sustituir &
se muestra después del /
carácter entre paréntesis.
Aquí está la sección de argumento de entrada / salida de la descripción de ayuda para :
+- Min-Max range of # of inputs
| +----- Alt. Default # of inputs
| |
V V
1--3 (1 / 2); 1 <--- Possible / Default # of outputs
^
|
Default # of inputs
¿Cómo determinó qué &
significa para cada función?
Muy cuidadosamente. Usando la API StackExchange , pudimos descargar todas las respuestas MATL que alguna vez se utilizaron en un desafío PPCG. Al analizar cada una de las respuestas, pudimos determinar la frecuencia con la que se utilizó cada especificación de entrada / salida para cada función. Con esta información, pudimos identificar objetivamente la especificación de entrada / salida que la &
metafunción debería representar para cada función. A veces no había un ganador claro, por lo que muchas funciones actualmente no se han &
definido.
Aquí está el script que usamos (desafortunadamente está escrito en MATLAB y no en MATL).
Y aquí hay un ejemplo del histograma de $
/ #
uso