&
Meta-Function (Alternative Input / Output Specification)
Традиционный способ указать количество входных аргументов для передачи в функцию заключается в использовании $
мета-функции
2$: % Two-input version of :
Точно так же, чтобы указать количество выходных аргументов, вы можете использовать #
мета-функцию, указав количество выходных аргументов,
2#S % Two-output version of sort
или если вы передаете число, которое больше числа выходных аргументов , определенные для функции, толькоmod(N, numberOfOutputs) + 1
выход подается.
4#S % Get only the second output of sort
Вы можете дополнительно указать логический массив в качестве входных данных #
для получения только определенных выходных аргументов.
TFT#u % Three output version of unique and discard the second output
Все эти спецификации ввода / вывода удобны, но они очень быстро увеличивают количество байтов. Чтобы справиться с этим, MATL представил &
мета-функцию в выпуске 17.0.0 . Эта&
мета-функция действует как ярлык для конкретной спецификации ввода или вывода для функции. Посмотрим, что это значит.
В нашем примере выше мы хотели использовать версию с двумя входами :
(создает вектор с одинаково расположенными значениями). Хотя число входных аргументов по умолчанию :
равно 1
(создает массив из [1...N]
), очень часто пользователь хочет указать начальное значение диапазона, который требует второго ввода. Итак, для :
, мы определили, &
чтобы быть ярлыком для 2$
.
10 % Push 10 to the stack
12 % Push 12 to the stack
2$: % Create an array: [10, 11, 12]
Теперь делается следующее, сохраняя байт !
10 12 &:
Как мы можем определить, что такое альтернативное количество аргументов?
Спецификация ввода / вывода, которая &
преобразуется в, зависит от конкретной функции, поэтому мы оптимизируем экономию байтов.
Раздел аргументов ввода / вывода описания справки для каждой функции был обновлен, чтобы указать, каково это альтернативное количество входов / выходов (если есть). Возможное количество входных или выходных аргументов отображается в виде диапазона, а значения по умолчанию для каждого из них показаны в скобках. Спецификация ввода / вывода, которую можно заменить, &
отображается после /
символа в скобках.
Вот раздел ввода / вывода аргумента описания справки для :
+- Min-Max range of # of inputs
| +----- Alt. Default # of inputs
| |
V V
1--3 (1 / 2); 1 <--- Possible / Default # of outputs
^
|
Default # of inputs
Как вы определили что &
значит для каждой функции?
Очень осторожно. Используя API StackExchange , мы смогли загрузить все ответы на MATL, которые когда-либо использовались в тесте PPCG. Анализируя каждый из ответов, мы смогли определить частоту, с которой каждая спецификация ввода / вывода использовалась для каждой функции. Используя эту информацию, мы смогли объективно определить спецификацию ввода / вывода, которую &
мета-функция должна представлять для каждой функции. Иногда не было явного победителя, поэтому многие функции в настоящее время не &
определены.
Вот скрипт, который мы использовали (к сожалению, он написан на MATLAB, а не на MATL).
А вот пример гистограммы из $
/ #
использования