Рекурсивный вызов функции
Добавлено: 23 окт 2024, 16:36
Как мы знаем, чтобы функция могла вызвать саму себя, нужно её объявить изнутри:
Теперь если мы просто вызовем функцию [$TestFunction], то получим в Терминал "OK"
а если протестируем наш рекурсивный вызов [$TestFunction recursive], то получим "recursive call" и "OK"
Мне стало интересно, можно ли вызвать функцию рекурсивно не указывая её явного имени, ведь мы знаем, что функция - это всегда массив и её имя хранится в первом элементе этого массива $0. Только вот беда, хранится там оно ещё и с префиксом "$" (зачем - это к разработчикам Микротик)
Так вот, после танцев с бубнами (то есть танцев с :parse) и отсечения префикса $ с помощью :pick, оказалось, что можно:
Теперь если функцию кто-нибудь переименует, то в коде её объявление и рекурсивный вызов переименовывать не нужно ! всё и так сработает, так как используя мой код указывать явное имя при рекурсивном вызове не требуется (оно будет взято из $0 самой функции каким бы оно ни было).
Код: Выделить всё
:global TestFunction do={
:if ($1="recursive") do={
:global TestFunction
[$TestFunction]
:put "recursive call"}
:put OK
}
а если протестируем наш рекурсивный вызов [$TestFunction recursive], то получим "recursive call" и "OK"
Мне стало интересно, можно ли вызвать функцию рекурсивно не указывая её явного имени, ведь мы знаем, что функция - это всегда массив и её имя хранится в первом элементе этого массива $0. Только вот беда, хранится там оно ещё и с префиксом "$" (зачем - это к разработчикам Микротик)
Так вот, после танцев с бубнами (то есть танцев с :parse) и отсечения префикса $ с помощью :pick, оказалось, что можно:
Код: Выделить всё
:global AnyName do={
:if ($1="test") do={
[[:parse [:parse ":global [:pick \$$0 1 [:len \$$0]]"]]];
[[:parse [:parse "[:pick \$$0 1 [:len \$$0]]"]]]
:put "Recursive call without mentioning the function name works"}
:put OK
}