LINUX.ORG.RU

Эх, хорошая вещь Tcl, и гуйня к нему простая.

gensym ★★
()
Ответ на: комментарий от buddhist

А почему бы не отвечать только тем, кто *знает* Tcl?

toady2
() автор топика
Ответ на: комментарий от quantum-troll

Я почти уверен, что рекурсии тут нет. Я бы хотел узнать, почему. И что будет (и почему), если ... выполняется больше 1 с.

toady2
() автор топика

рекурсии не будет, только имя для процедуры выберите другое, чтобы не путалось со стандартным update

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

чтобы не путалось со стандартным update

да, код просто для примера.

рекурсии не будет

А почему? Я верно понимаю, что интерпретатор просто отметит себе, что через секунду выполнить тот код, а сам пойдет дальше? И так далее.

toady2
() автор топика
Ответ на: комментарий от toady2

Я почти уверен

Но всегда лучше проверить.

proc update {} {
  puts "teh start of update"
  after 1000 {
      puts "in after 1000 {...}"
      update
  }
}
Или ты про оптимизацию рекурсии? Tcl её вообще умеет?

quantum-troll ★★★★★
()
Ответ на: комментарий от toady2

Я верно понимаю, что интерпретатор просто отметит себе, что через секунду выполнить тот код, а сам пойдет дальше?

да, правильно.

MKuznetsov ★★★★★
()
Ответ на: комментарий от quantum-troll

Или ты про оптимизацию рекурсии? Tcl её вообще умеет?

8.6 умеет команду tailcall

Begemoth ★★★★★
()
Ответ на: комментарий от quantum-troll

Я не понял, что ваш код проверяет. То, что примерно раз в секунду будет выводится «in after 1000 {...}» ежу ясно. Я спрашивал о другом (в частности, стоит ли волноваться за стек).

toady2
() автор топика
Ответ на: комментарий от MKuznetsov

Спасибо большое. Вопрос закрыт.

toady2
() автор топика

По сути это выглядит где-то так: есть некоторый пул объектов за которыми следит событийный цикл after добавляет новый объект (в данном случае вызов update) в этот пул и на этом функция update завершается когда наступает время вызова update всё повторяется

Сам событийный цикл

while (1) {
	redy_objects = get_ready_objects();
	for (obj in ready_objects) {
		obj.callback();
	}
}

Таким образом рекурсии нет.

Olegymous ★★★
()
Ответ на: комментарий от quantum-troll

В версии 8.6 запилили «non-recursive bytecode engine (aka stackless)». Для реализации хвостовых вызовов добавили команду tailcall

qaqa ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.