Хочется странного
Jul. 20th, 2016 04:28 pmВнезапно захотелось странного: возможности рекурсивно вызвать вызвавшую функцию с заменой некоторых ее аргументов согласно определенному правилу. Например, у меня есть
void foo(T1 arg1, T2 arg2, T3 arg3, T4 arg4) {
...
if (сложное условие) {
T3 newArg3 = сложное вычисление;
return foo(arg1, arg2, newArg3, arg4);
}
...
}и
T5 bar(T1A arg1, T2A arg2, T3 arg3) {
...
if (то же самое сложное условие) {
T3 newArg3 = то же самое сложное вычисление;
return bar(arg1, arg2, newArg3);
}
...
}Как прикажете выфакторизовывать сложное условие и сложное вычисление? В идеале (псевдокод) было бы что-то вроде
Maybe T baz(данные для вычисления условия и newArg3) {
// "Maybe void" must be == bool.
if (сложное условие) {
return Just recurseParent(map (3 => сложное вычисление));
}
return None;
}
void foo(T1 arg1, T2 arg2, T3 arg3, T4 arg4) {
...
if (baz(...)) {
return;
...
}
T5 bar(T1A arg1, T2A arg2, T3 arg3) {
...
Maybe T5 val = baz(...);
if (val != None)
return val;
...
}Какой-нибудь язык сейчас так может?