A &
Meta-Função (Especificação Alternativa de Entrada / Saída)
A maneira tradicional de especificar o número de argumentos de entrada a serem transmitidos para uma função é usar a $
meta-função
2$: % Two-input version of :
Da mesma forma, para especificar o número de argumentos de saída, você pode usar a #
meta-função que especifica o número de argumentos de saída,
2#S % Two-output version of sort
ou se você passar um número maior que o número de argumentos de saída definidos para uma função, apenas a mod(N, numberOfOutputs) + 1
saída será fornecida.
4#S % Get only the second output of sort
Além disso, você pode especificar uma matriz lógica como a entrada #
para recuperar apenas argumentos de saída específicos.
TFT#u % Three output version of unique and discard the second output
Todas essas especificações de entrada / saída são úteis, mas aumentam sua contagem de bytes muito rapidamente. Para lidar com isso, o MATL introduziu a &
meta-função na versão 17.0.0 . Essa &
meta-função atua como um atalho para uma especificação de entrada ou saída específica para uma função. Vamos ver o que isso significa.
No exemplo acima, queríamos usar a versão de duas entradas :
(cria um vetor de valores igualmente espaçados). Embora o número padrão de argumentos de entrada :
seja 1
(crie uma matriz a partir de [1...N]
), é muito comum que um usuário queira especificar o valor inicial do intervalo que requer a segunda entrada. Então :
, definimos &
como um atalho para 2$
.
10 % Push 10 to the stack
12 % Push 12 to the stack
2$: % Create an array: [10, 11, 12]
Agora se torna o seguinte, salvando um byte !
10 12 &:
Como podemos determinar qual é o número alternativo de argumentos?
A especificação de entrada / saída que é &
traduzida é específica da função , otimizando a economia de bytes.
A seção argumento de entrada / saída da descrição da ajuda para cada função foi atualizada para indicar qual é esse número alternativo de entradas / saídas (se houver). O número possível de argumentos de entrada ou saída é exibido como um intervalo e os valores padrão para cada um são mostrados entre parênteses. A especificação de entrada / saída que pode ser substituída &
é mostrada após o /
caractere entre parênteses.
Aqui está a seção do argumento de entrada / saída da descrição da ajuda 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
Como você determinou o que &
significa para cada função?
Muito cuidado. Usando a API StackExchange , conseguimos fazer o download de todas as respostas MATL que já foram usadas em um desafio PPCG. Ao analisar cada uma das respostas, conseguimos determinar a frequência com que cada especificação de entrada / saída foi usada para cada função. Usando essas informações, conseguimos identificar objetivamente a especificação de entrada / saída que a &
meta-função deve representar para cada função. Às vezes, não havia um vencedor claro; muitas funções atualmente não foram &
definidas.
Aqui está o script que usamos (infelizmente, está escrito em MATLAB e não em MATL).
E aqui está um exemplo do histograma de $
/ #
use