spamsink: (lenin)
[personal profile] spamsink


Внезапно захотелось странного: возможности рекурсивно вызвать вызвавшую функцию с заменой некоторых ее аргументов согласно определенному правилу. Например, у меня есть
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;
    ...
}


Какой-нибудь язык сейчас так может?
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting
Page generated Mar. 7th, 2026 01:11 am
Powered by Dreamwidth Studios