Ruby выполняет Оптимизацию последнего вызова?

Вы должны перебрать список результатов, как вы делали значения arrText ранее.

static void Main(string[] args)
{
    string fileName = @"C:\Users\thoma\Documents\Visual Studio 2019\Backup Files\data.txt";
    var arrText = File.ReadLines(fileName).ToList();         

    foreach (string sOutput in arrText)
        Console.WriteLine(sOutput);

    Console.WriteLine("Order alphabetically ascending press 'a': ");
    Console.WriteLine("Ordener descendant alphabetical press 'b': ");                       

    var instruccion = Console.ReadLine();
    IEnumerable<string> resultList;
    if (instruccion == "a")
        resultList = arrText.Where(o => o.ToLower().StartsWith("r")).OrderBy(o => o);
    else if (instruccion == "b")
         resultList = arrText.Where(o => o.ToLower().StartsWith("r")).OrderByDescending(o => o);
    else
        resultList = Enumerable.Empty<string>();

    foreach(var item in resultList)
        Console.WriteLine(item);    

    Console.ReadLine();
}
90
задан Jörg W Mittag 5 May 2009 в 13:24
поделиться

2 ответа

Нет, Ruby не выполняет TCO. Однако он также не не выполняет TCO.

Спецификация языка Ruby ничего не говорит о TCO. Он не говорит, что вы должны это делать, но также не говорит, что вы не можете это сделать. Вы просто не можете полагаться на него .

Это не похоже на схему, где спецификация языка требует , что все реализации должны выполнить TCO. Но это также не похоже на Python, где Гвидо ван Россум несколько раз (последний раз всего пару дней назад) очень ясно давал понять, что реализации Python не должны выполнять TCO.

Юкихиро Мацумото является сочувствует ТШО, просто не любит Я не хочу, чтобы все реализации поддерживали его. К сожалению, это означает, что вы не можете полагаться на совокупную стоимость владения, иначе ваш код больше не будет переносимым для других реализаций Ruby.

Итак, некоторые реализации Ruby выполняют совокупную стоимость владения, но большинство - нет. YARV, например, поддерживает TCO, хотя (на данный момент) вам нужно явно раскомментировать строку в исходном коде и перекомпилировать виртуальную машину, чтобы активировать TCO - в будущих версиях он будет включен по умолчанию, после того, как реализация покажет стабильный. Виртуальная машина Parrot изначально поддерживает TCO, поэтому Cardinal может легко ее поддерживать. В CLR есть некоторая поддержка TCO, а это значит, что IronRuby и Ruby.NET, вероятно, могут это сделать. Rubinius, вероятно, тоже мог бы это сделать.

Но JRuby и XRuby не поддерживают TCO и, вероятно, не будут, если сама JVM не получит поддержку TCO. Проблема заключается в следующем: если вы хотите иметь быструю реализацию, а также быструю и бесшовную интеграцию с Java, вы должны быть стек-совместимы с Java и максимально использовать стек JVM. Вы можете довольно легко реализовать совокупную стоимость владения с помощью трамплинов или явного стиля передачи продолжения, но тогда вы больше не используете стек JVM, что означает, что каждый раз, когда вы хотите вызвать Java или вызвать Java в Ruby, вы должны выполнить какой-то преобразование, которое происходит медленно. Итак, XRuby и JRuby выбрали скорость и интеграцию Java вместо совокупной стоимости владения и продолжений (которые в основном имеют одну и ту же проблему).

Это применимо ко всем реализациям Ruby, которые хотят тесно интегрироваться с какой-либо хост-платформой, которая не поддерживает TCO изначально. Например,

125
ответ дан 24 November 2019 в 07:02
поделиться

Может иметь, но не гарантирует:

https://bugs.ruby-lang.org/issues/1256

12
ответ дан 24 November 2019 в 07:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: