Вот метод, который гарантирует порядок выполнения и (с изменениями, упомянутыми в конце) позволяет передавать разные аргументы различным функциям.
call1 = @(a,b) a();
call12 = @(a,b) call1(b,call1(a,b));
Ключ - call1
, который вызывает первый аргумент и игнорирует второй. call12
вызывает свой первый аргумент, а затем второй, возвращая значение из второго. Это работает, потому что функция не может быть оценена перед ее аргументами. Чтобы создать свой пример, вы должны написать:
foo = @() call12(functionCall1, functionCall2);
Тестовый код
Вот код теста, который я использовал:
>> print1=@()fprintf('1\n');
>> print2=@()fprintf('2\n');
>> call12(print1,print2)
1
2
Вызов дополнительных функций
Чтобы вызвать 3 функции, вы можете написать
call1(print3, call1(print2, call1(print1,print2)));
4 функции:
call1(print4, call1(print3, call1(print2, call1(print1,print2))));
Для получения дополнительных функций продолжите шаблон вложения.
Передача аргументов
Если вам нужно передать аргументы, вы можете написать версию call1
, которая принимает аргументы, а затем внести очевидное изменение в call12
.
call1arg1 = @(a,arg_a,b) a(arg_a);
call12arg1 = @(a, arg_a, b, arg_b) call1arg1(b, arg_b, call1arg1(a, arg_a, b))
Вы также можете создавать версии call1, которые принимают несколько аргументов, смешивают и подбирают их соответствующим образом.