Информация об изменениях

Сообщение Re[57]: The door от 18.07.2018 10:27

Изменено 18.07.2018 10:28 vdimas

Re[57]: The door
Здравствуйте, Ikemefula, Вы писали:

Вдогонку к этому:

Вопрос:
что помешало сделать так:

...
var x = default;
x = some_expression(other_variables);
...


и разрешить рекурсию прямо в выражениях?


Через такую-то мать можно дотолкать:
        class Box<T> { public T value; }

        static Box<IEnumerable<T>> trick<T>() => new Box<IEnumerable<T>>();

        static IEnumerable<T> fuck_the_system<T>(Box<IEnumerable<T>> trick, IEnumerable<T> en) {
            trick.value = en;
            return en;
        }

        static void RecursionTest()
        {
            int[] source = new int[] { 1, 3, 1, 2, 3, 1, 3, 2, 1 };

            var y = from _ in new int[1]
                    let trick = trick<int>()
                    let func = fuck_the_system(trick, source.Where((x, index) => RecursiveFilter(trick.value, x, index)))
                    from c in func
                    select c;

            foreach (var x in y)
                Console.WriteLine(x);
        }

Список костылей:
from _ in new int[1] — выражение не может начинаться с let, поэтому делаем "фикстивный" цикл верхнего уровня;
let trick = trick<int>() — присваиваем переменной не само значение, а адрес другой (целевой) переменной;
fuck_the_system — присваиваем значение целевой переменной.
Re[57]: The door
Здравствуйте, Ikemefula, Вы писали:

Вдогонку к этому:

Вопрос:
что помешало сделать так:

...
var x = default;
x = some_expression(other_variables);
...


и разрешить рекурсию прямо в выражениях?


Через такую-то мать можно дотолкать:
        class Box<T> { public T value; }

        static Box<IEnumerable<T>> trick<T>() => new Box<IEnumerable<T>>();

        static IEnumerable<T> fuck_the_system<T>(Box<IEnumerable<T>> trick, IEnumerable<T> en) {
            trick.value = en;
            return en;
        }

        static void RecursionTest()
        {
            int[] source = new int[] { 1, 3, 1, 2, 3, 1, 3, 2, 1 };

            var y = from _ in new int[1]
                    let trick = trick<int>()
                    let func = fuck_the_system(trick, source.Where((x, index) => RecursiveFilter(trick.value, x, index)))
                    from c in func
                    select c;

            foreach (var x in y)
                Console.WriteLine(x);
        }

Список костылей:
from _ in new int[1] — выражение не может начинаться с let, поэтому делаем "фиктивный" цикл верхнего уровня;
let trick = trick<int>() — присваиваем переменной не само значение, а адрес другой (целевой) переменной;
fuck_the_system — присваиваем значение целевой переменной.