proc iota1 n {expr {$n == 1? 1: [concat [iota1 [- $n 1]] $n]}}

rdt For completeness, shouldn't your definition of - (from func) be here also? - RS: Oops, of course - just another one-liner :)

proc - {a {b ""}} {expr {$b eq ""? -$a: $a-$b}}

To illustrate the recursionlimit problem (which is directly related to the C stack):

% interp recursionlimit {} 10000 10000 % proc Llength list {expr {$list eq ""? 0: 1 + [Llength [lrange $list 1 end]]}} % Llength [iota1 398] 398 % Llength [iota1 399] too many nested evaluations (infinite loop?)Of course it's silly to reimplement llength this wasteful way, as Tcl' lists first and foremost know how long they are - but in Lisp, this implementation might make more sense :)

Lars H: On the bifurcation page there is a Tcl command using which one can do "in-place recursion" (even branching recursions), i.e., recursion without using up space on the C stack.NEM: See tail call optimization for other ways of achieving recursion in constant stack space.

Category Concept | Arts and crafts of Tcl-Tk programming