Pull to refresh

Comments 23

Самомодифицирующийся код вообще штука крайне дырявая по своей сути, да и отладчики и анализаторы малость с ума сходят от такого.
К тому же, он не поддаётся JIT-компиляции, и тратится время на парсинг нового кода. Генерировать код во время загрузки — нормально, генерировать функцию каждую рекурсию — тормоза.
Никто и не предлагал генерировать функцию каждый раз :-)
Код функций, созданных конструктором Function, поддается компиляции.
Относитесь к этому, как к макросам на препроцессоре Си. Тоже страшная вещь, из-за которой могут возникнуть трудноотлавливаемые ошибки (да и отладчикам с анализаторами туго), но программисты на Си нередко их используют :-)
UFO just landed and posted this here
Макросами тоже не пользуюсь, практически. Но в макрос хотя-бы не может прилетать рандомный код из интернета.
Зачем в приведенном примере вообще рекурсия и даже отдельная функция? Всё можно было сделать циклом с аккумулятором. А если рекурсия разветвляющаяся (типа заливки или двоичного дерева), лучше использовать массив-стек.
Вижу, у кого-то есть противоположное мнение. Не могли бы вы разъяснить?
Минус я не ставил, но попробую ответить: just for fun
Статья — о хвостовой рекурсии, а не о подсчете чисел Фибоначчи. Любая рекурсивная функция (из тех, что можно переписать в вид с хвостовой рекурсией) сгодилась бы, но рекурсивный алгоритм подсчета числ Фибоначчи используется здесь (а также во многих других местах) как стандартный пример рекурсии.
Вероятно, что автор просто не нашел лучше примера, чем просто описать крайне простую операцию через хвостовую рекурсию. Это крайне похоже на пример с факториалом, который считают через рекурсию. (Пример неудачный, я с вами согласен)
У меня было другое представление о хвостовой рекурсии (это набросок, подробнее в вики):

function A() { /*условия*/ B(); } function B() { /* условия */ A(); }

Так почему же несогласны? Автор попытался изложить материал на примере, пускай и неудачном, но за что его так сильно пинать?
Тут дело не в примере. Хвостовая рекурсия всегда может быть записана как цикл с аккумулятором, так что единственное зачем это нужно — just for fun.
Собственно, функция tail2 как раз это и делает — переписывает код с хвостовой рекурсией в код с циклом :-) Разумеется, никто не мешает сразу организовать цикл самому программисту.
Может-то может. Вот только очень часто запись через рекурсию компактнее и проще для понимания.
ну это как когда объясняют вычитание на примере «у тебя было 3 яблока, ты отдал одно Васе ...» и тот кому объясняют спрашивает «а почему, собственно, я должен отдавать яблоки Васе?»
Данные функции даны как примеры! Они выполняют свою роль демонстрации метода.
Для ненормального программирование — вполне сойдёт.
Надо только не забыть внутрь текста для eval добавить комментарий, что тут полная жопа и дебажить даже не стоит пытаться.
Вместо
return eval("var $tail$function = function "+name+"("+args.join(",")+") {"+newBody+"};$tail$function");
можно обойтись
return Function(args.join(','),newBody)

А так — довольно интересное решение, жаль контекст объявления функции теряется.
Контекст легко вернуть:

var that = this;
return function () {
    return Function(args.join(','), newBody).call(that);
}
Не о том контексте речь — речь о области видимости переменных, если так понятней.
var foo=21;
!function(){
  var foo=42;
  function fn1(){
    console.log(foo)}
  var src=fn1.toString();
  var fn2=Function(src.substring(src.indexOf('{')+1,src.lastIndexOf('}')));
  fn1();//=>42
  fn2();//=>21
  }()
С eval'ом примерно та же ситуация, но с другого бока — функция объявляется не в глобальном контексте, а в контексте замыкания Function.prototype.tail.
Клёва. А почему бы подобное не сделать в общем случае? Вроде же, понятно, когда вызов хвостовой в общем случае.
Вы имеете в виду хвостовые вызовы других функций (не себя)? В теле одной функции этого так просто не сделаешь, получится подобие трамплина, который описан по ссылке в статье. Это медленно. Да, можно написать такой препроцессор, который хвостовые вызовы преобразует так, как требуется в этой статье.
Sign up to leave a comment.

Articles