Error processing request

Parameters

CONTENT_LENGTH0
REQUEST_METHODGET
REQUEST_URI/revision/nested+list?V=27
QUERY_STRINGV=27
CONTENT_TYPE
DOCUMENT_URI/revision/nested+list
DOCUMENT_ROOT/var/www/nikit/nikit/nginx/../docroot
SCGI1
SERVER_PROTOCOLHTTP/1.1
HTTPSon
REMOTE_ADDR172.71.255.16
REMOTE_PORT29748
SERVER_PORT4443
SERVER_NAMEwiki.tcl-lang.org
HTTP_HOSTwiki.tcl-lang.org
HTTP_CONNECTIONKeep-Alive
HTTP_ACCEPT_ENCODINGgzip, br
HTTP_X_FORWARDED_FOR18.119.131.72
HTTP_CF_RAY87a015775c8a22fe-ORD
HTTP_X_FORWARDED_PROTOhttps
HTTP_CF_VISITOR{"scheme":"https"}
HTTP_ACCEPT*/*
HTTP_USER_AGENTMozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; [email protected])
HTTP_CF_CONNECTING_IP18.119.131.72
HTTP_CDN_LOOPcloudflare
HTTP_CF_IPCOUNTRYUS

Body


Error

Unknow state transition: LINE -> END

-code

1

-level

0

-errorstack

INNER {returnImm {Unknow state transition: LINE -> END} {}} CALL {my render_wikit {nested list} **\ Introduction\ **\n\nA\ ''nested\ list''\ is\ simply\ a\ list\ that\ occurs\ as\ an\ element\ of\ another\ list\ (which\ may\ of\ course\ itself\ be\ an\ element\ of\ another\ list,\ etc.).\n\n<<TOC>>\n\nCommon\ reasons\ nested\ lists\ arise\ are:\n\ \ \ 1.\ They're\ matrices\ (a\ list\ of\ rows,\ where\ each\ row\ is\ itself\ a\ list,\ or\ a\ list\ of\ columns\ where\ each\ column\ is\ itself\ a\ list).\n\ \ \ 2.\ Lists\ are\ being\ used\ for\ what\ in\ other\ languages\ is\ known\ as\ structs,\ \[record\]s,\ or\ tuples\ --\ collections\ of\ data\ with\ a\ fixed\ structure.\n\ \ \ 3.\ A\ \[tree\]\ is\ encoded\ as\ a\ list\ where\ the\ subtrees\ occur\ as\ elements\ (hence\ lists\ are\ nested\ as\ deeply\ as\ the\ tree\ is\ high).\n\n\[\[Discuss\ when\ using\ a\ nested\ list\ is\ important\ or\ useful\ -\ what\ are\ cases\ where\ it\ is\ a\ good\ solution\]\]\n\nBefore\ Tcl\ 8.4,\ nested\ lists\ were\ quite\ difficult\ to\ work\ with\ --\ getting\ nested\ elements\ required\ nesting\ \[lindex\]\ commands,\ and\ the\ nightmare\ of\ setting\ elements\ in\ nested\ lists\ without\ the\ help\ of\ \[lset\]\ is\ better\ forgotten\ --\ and\ as\ a\ result\ older\ code\ often\ uses\ \[array\]s\ even\ in\ cases\ where\ the\ first-class\ data\ status\ (being\ possible\ to\ pass\ by\ value)\ of\ a\ list\ would\ have\ been\ very\ useful.\ \n\n\n\[\[Discuss\ which\ Tcl\ built\ in\ commands\ can\ be\ used\ to\ build,\ search,\ and\ maintain\ the\ list\]\]\n\n----\n\ \ \ \ *\ \[split\ and\ join\ for\ nested\ lists\]\n\ \ \ \ *\ \[Trees\ as\ nested\ lists\]\n\ \ \ \ *\ \[Nested\ list\ join\]\n\ \ \ \ *\ \[Tables\]\n\ \ \ \ *\ \[Menu\ as\ trees\ as\ nested\ list\]\n----\n**\[LISP\]-style\ lists**\n\nIn\ \[LISP\],\ lists\ are\ built\ by\ linking\ \"cons\ cells\",\ which\ is\ simply\ a\ pair\ of\ values\ (typically\ implemented\ close\ to\ the\ hardware,\ e.g.\ as\ a\ C-struct\ of\ two\ pointers\;\ a\ \[Tcl_Obj\]\ is\ a\ higher\ level\ concept)\ where\ the\ first\ (the\ head)\ by\ convention\ is\ the\ first\ list\ element\ and\ the\ second\ (the\ tail)\ is\ the\ rest\ of\ the\ list\;\ in\ the\ last\ cell\ of\ a\ list\ the\ tail\ pointer\ is\ \[NULL\].\ The\ following\ is\ (yet\ another)\ implementation\ of\ this,\ with\ Tcl\ lists\ of\ length\ 2\ serving\ as\ cons\ cells.\ It\ is\ probably\ not\ of\ any\ practical\ interest.\n\n'''FM''':\ Maybe\ an\ higher\ concept\ level\ has\ some\ higher\ conceptuals\ properties.\ Who\ knows\ ?\ A\ Tcl'ers\ is\ always\ dealing\ with\ such\ things,\ so\ why\ do\ not\ have\ some\ proc\ to\ experiment\ with\ it\ ?\ \n\n***\ Nested\ list\ of\ constant\ length\ 2\ ***\n\n<<TOC>>\n\n****\ nl2\ package\ ****\n======\n#############################\n#\ ensemble\ of\ commands\ \ \ \ \ \ #\n#############################\nset\ nl2\ \{\n\ \ \ \ \ \ \ \{append\ \{append\ at\ the\ end\ of\ the\ 2-length\ nested\ list\ variable\ (like\ lappend)\}\}\n\ \ \ \ \ \ \ \{assign\ \{assign\ each\ member\ of\ the\ 2-length\ nested\ list\ value\ to\ variables\ (like\ lassign)\}\}\n\ \ \ \ \ \ \ \{concat\ \{To\ do\ :\ concat\ for\ list\ work\ on\ non-list\ object\ too,\ so\ I\ haven't\ find\ what\ to\ do\ for\ this\ command\}\}\n\ \ \ \ \ \ \ \{flat\ \{convert\ a\ 2-length\ nested\ list\ value\ as\ a\ flat\ list\}\}\n\ \ \ \ \ \ \ \{index\ \{retrieve\ one\ or\ all\ element\ of\ the\ 2-length\ nested\ list\ value\}\}\n\ \ \ \ \ \ \ \{insert\ \{insert\ one\ element\ at\ the\ place\ specified\ to\ a\ 2-length\ nested\ list\ value\ -\ return\ a\ new\ value\}\}\n\ \ \ \ \ \ \ \ is\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \{left\ \{test\ if\ the\ given\ object\ value\ is\ a\ 2-length\ left\ nested\ list\}\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \{right\ \{test\ if\ the\ given\ object\ value\ is\ a\ 2-length\ right\ nested\ list\}\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \{mixed\ \{test\ if\ the\ given\ object\ value\ is\ a\ 2-length\ left\ nested\ list,\ whose\ elements\ are\ 2-length\ right\ nested\ list\ and\ vice-versa\}\}\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \{join\ \{convert\ the\ nested\ list\ as\ a\ string\ in\ the\ style\ of\ join\ for\ list\}\}\n\ \ \ \ \ \ \ \ \{left\ \{make\ a\ left\ nested\ list\ with\ all\ arguments\}\}\n\ \ \ \ \ \ \ \ \{length\ \{return\ the\ depth\ of\ the\ nested\ list\}\}\n\ \ \ \ \ \ \ \ \{merge\ \{merge\ a\ right\ 2-length\ nested\ list\ with\ a\ left\ 2-length\ nested\ list\ to\ a\ middle\ 3-length\ nested\ list\ \}\}\n\ \ \ \ \ \ \ \ \{merge-left\ \{merge\ a\ right\ 2-length\ nested\ list\ with\ a\ left\ 2-length\ nested\ list\ to\ a\ left\ 3-length\ nested\ list\}\}\n\ \ \ \ \ \ \ \ \{merge-right\ \{merge\ a\ right\ 2-length\ nested\ list\ with\ a\ left\ 2-length\ nested\ list\ to\ a\ left\ 3-length\ nested\ list\}\}\n\ \ \ \ \ \ \ \ \{merge-dict\ \{merge\ a\ right\ 2-length\ nested\ list\ with\ a\ left\ 2-length\ nested\ list\ as\ a\ dict\}\}\n\ \ \ \ \ \ \ \ \{range\ \{return\ a\ range\ of\ elements\ of\ a\ 2-length\ nested\ list\ value\ ans\ return\ it\ as\ nested\ list\}\}\n\ \ \ \ \ \ \ \ repeat\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ left\ \{like\ lrepeat\ but\ make\ a\ left\ 2-length\ nested\ list\}\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ right\ \{like\ lrepeat\ but\ make\ a\ right\ 2-length\ nested\ list\}\}\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \{reverse\ \{reverse\ the\ order\ of\ a\ 2-length\ nested\ list\ value\}\}\n\ \ \ \ \ \ \ \ \{right\ \{make\ a\ left\ nested\ list\ with\ all\ arguments\}\}\n\ \ \ \ \ \ \ \ \{search\ \{like\ lsearch\ for\ 2-length\ nested\ list\}\}\n\ \ \ \ \ \ \ \ \{sort\ \{like\ sort\ for\ 2-length\ nested\ list\}\}\n\ \ \ \ \ \ \ \ \{set\ \{set\ an\ element\ of\ a\ 2-length\ nested\ list\ variable\}\}\n\ \ \ \ \ \ \ \ \{transpose\ \{change\ a\ 2-length\ left\ nested\ list\ value\ in\ a\ 2\ length\ right\ nested\ list\ value\ (and\ vice-versa)\}\}\n\ \ \ \ \ \ \ \ \{type\ \{return\ the\ type\ of\ the\ 2-length\ nested\ list,\ if\ any,\ return\ \"\"\ otherwise\}\}\n\ \ \ \ \ \ \ \ \{!type\}\ \{return\ the\ type\ \"left\"\ for\ a\ right\ 2-length\ nested\ list\ value,\ or\ \"right\"\ for\ a\ left\ 2-length\ nested\ list\}\}\n\}\n\nnamespace\ eval\ nl2\ \{\n\ \ \ \ proc\ append\ \{L\ args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl2\ append\ ...\n\ \ \ \ \ \ \ \ ::upvar\ \$L\ nl\n\ \ \ \ \ \ \ \ ::if\ \{\[nl2\ is\ left\ \$nl\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::for\ \{::set\ i\ 0\}\ \{\[::llength\ \[::lindex\ \$nl\ \{*\}\$i\]\]!=0\}\ \{::lappend\ i\ 0\}\ \{\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lset\ nl\ \{*\}\$i\ \[nl2\ left\ \{*\}\$args\]\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl2\ is\ right\ \$nl\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::for\ \{::set\ i\ 1\}\ \{\[::llength\ \[::lindex\ \$nl\ \{*\}\$i\]\]!=0\}\ \{::lappend\ i\ 1\}\ \{\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lset\ nl\ \{*\}\$i\ \[nl2\ right\ \{*\}\$args\]\n\ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::foreach\ e\ \$args\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ nl\ \$e\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \}\ \ \ \ \ \ \n\ \ \ \ \}\n\ \ \ \ proc\ assign\ \{L\ varname\ args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl2\ assign\ ...\n\ \ \ \ \ \ \ \ if\ \{\[nl2\ is\ left\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \[nl2\ left\ \{*\}\[uplevel\ \[subst\ \{lassign\ \{\[nl2\ flat\ \$L\]\}\ \$varname\ \$args\}\]\]\]\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl2\ is\ right\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \[nl2\ right\ \{*\}\[uplevel\ \[subst\ \{lassign\ \{\[nl2\ flat\ \$L\]\}\ \$varname\ \$args\}\]\]\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ concat\ \{\}\ \{\n\ \ \ \ \ \ \ \ #\ nl2\ concat\ ...\n\ \ \ \ \ \ \ \ #\ to\ do\n\ \ \ \ \}\n\ \ \ \ proc\ flat\ \{L\}\ \{\n\ \ \ \ \ \ \ \ #\ nl2\ flat\ ...\n\ \ \ \ \ \ \ \ ::if\ \{\[nl2\ is\ left\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::for\ \{::set\ i\ 1\}\ \{\[::llength\ \[::lindex\ \$L\ \{*\}\$i\]\]!=0\}\ \{::set\ i\ \[::linsert\ \$i\ 0\ 0\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ Res\ \{*\}\[::lindex\ \$L\ \{*\}\$i\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$Res\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl2\ is\ right\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::for\ \{::set\ i\ 0\}\ \{\[::llength\ \[::lindex\ \$L\ \{*\}\$i\]\]!=0\}\ \{::set\ i\ \[::linsert\ \$i\ 0\ 1\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ Res\ \{*\}\[::lindex\ \$L\ \{*\}\$i\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$Res\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ index\ \{L\ args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl2\ index\ ...\n\ \ \ \ \ \ \ \ ::return\ \[::lindex\ \[nl2\ flat\ \$L\]\ \$args\]\ \ \ \ \ \n\ \ \ \ \}\n\ \ \ \ proc\ insert\ \{L\ index\ element\ args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl2\ insert\ ...\n\ \ \ \ \ \ \ \ if\ \{\[nl2\ is\ left\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl2\ left\ \{*\}\[linsert\ \[nl2\ flat\ \$L\]\ \$index\ \$element\ \{*\}\$args\]\]\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl2\ is\ right\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl2\ right\ \{*\}\[linsert\ \[nl2\ flat\ \$L\]\ \$index\ \$element\ \{*\}\$args\]\]\n\ \ \ \ \ \ \ \ \}\ \ \n\ \ \ \ \}\n\ \ \ \ namespace\ eval\ is\ \{\n\ \ \ \ \ \ \ \ proc\ left\ \{L\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ #\ nl2\ is\ left\ ...\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ ::if\ \{\[::llength\ \$L\]\ ==\ 2\ &&\ \[::llength\ \[::lindex\ \$L\ 0\]\]\ ==\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ elseif\ \{\[::llength\ \$L\]\ ==\ 2\ &&\ \[::llength\ \[::lindex\ \$L\ 0\]\]\ ==\ 2\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ \[nl2\ is\ left\ \[::lindex\ \$L\ 0\]\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ proc\ mixed\ \{L\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ #\ nl2\ is\ mixed\ ...\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl2\ type\ \$L\]\]\ eq\ \"\"\}\ \{return\ \$res\}\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ foreach\ e\ \[nl2\ index\ \$L\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ \[expr\ \{\$res\ &&\ (\[nl2\ !type\ \$e\]\ eq\ \$type)\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$res\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ proc\ right\ \{L\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ #\ nl2\ is\ right\ ...\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ ::if\ \{\[::llength\ \$L\]\ ==\ 2\ &&\ \[::llength\ \[::lindex\ \$L\ 1\]\]\ ==\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ elseif\ \{\[::llength\ \$L\]\ ==\ 2\ &&\ \[::llength\ \[::lindex\ \$L\ 1\]\]\ ==\ 2\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ \[nl2\ is\ right\ \[::lindex\ \$L\ 1\]\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ \ \ \ \ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ namespace\ export\ *\n\ \ \ \ \ \ \ \ namespace\ ensemble\ create\n\ \ \ \ \}\n\ \ \ \ proc\ join\ \{L\ \{sz\ \{\ \}\}\}\ \{\n\ \ \ \ \ \ \ \ #\ nl2\ join\ ...\n\ \ \ \ \ \ \ \ ::join\ \[nl2\ flat\ \$L\]\ \$sz\n\ \ \ \ \}\n\ \ \ \ proc\ left\ \{args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl2\ left\ ...\n\ \ \ \ \ \ \ \ ::set\ L\ \[::list\ \"\"\]\n\ \ \ \ \ \ \ \ ::set\ i\ 0\n\ \ \ \ \ \ \ \ ::foreach\ e\ \$args\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[llength\ \$e\]\ !=\ 1\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \[::list\ \"\"\ \[list\ \$e\]\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \[::list\ \"\"\ \$e\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ i\ 0\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ ::return\ \{*\}\$L\ \ \n\ \ \ \ \}\n\ \ \ \ proc\ length\ \{L\}\ \{\n\ \ \ \ \ \ \ \ #\ nl2\ length\ ...\n\ \ \ \ \ \ \ \ ::set\ j\ 1\n\ \ \ \ \ \ \ \ ::if\ \{\[nl2\ is\ left\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::for\ \{::set\ i\ 0\}\ \{\[::llength\ \[::lindex\ \$L\ \{*\}\$i\]\]!=0\}\ \{::lappend\ i\ 0\;\ incr\ j\}\ \{\}\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl2\ is\ right\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::for\ \{::set\ i\ 1\}\ \{\[::llength\ \[::lindex\ \$L\ \{*\}\$i\]\]!=0\}\ \{::lappend\ i\ 1\;\ incr\ j\}\ \{\}\n\ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ j\ 0\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ ::return\ \$j\n\ \ \ \ \}\n\ \ \ \ proc\ merge\ \{L0\ L1\}\ \{\n\ \ \ \ \ \ \ \ if\ \{\[nl2\ is\ left\ \$L0\]\ &&\ \[nl2\ is\ right\ \$L1\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ L\ \[list\ \{\}\]\;\ ::set\ i\ \{\}\n\ \ \ \ \ \ \ \ \ \ \ \ foreach\ x\ \[nl2\ index\ \$L0\]\ y\ \[nl2\ index\ \$L1\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ lset\ L\ 0\ \{*\}\$i\ \[list\ \$x\ \{\}\ \$y\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ i\ \[linsert\ \$i\ 0\ 1\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$L\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl2\ is\ left\ \$L1\]\ &&\ \[nl2\ is\ right\ \$L0\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ L\ \[list\ \{\}\]\;\ ::set\ i\ \{\}\n\ \ \ \ \ \ \ \ \ \ \ \ foreach\ x\ \[nl2\ index\ \$L1\]\ y\ \[nl2\ index\ \$L0\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ lset\ L\ 0\ \{*\}\$i\ \[list\ \$x\ \{\}\ \$y\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ i\ \[linsert\ \$i\ 0\ 1\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$L\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ merge-dict\ \{L0\ L1\}\ \{\n\ \ \ \ \ \ \ \ if\ \{\[nl2\ is\ left\ \$L0\]\ &&\ \[nl2\ is\ right\ \$L1\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ foreach\ e0\ \[nl2\ index\ \$L0\]\ e1\ \[nl2\ index\ \$L1\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ L\ \$e0\ \$e1\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$L\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl2\ is\ left\ \$L1\]\ &&\ \[nl2\ is\ right\ \$L0\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ foreach\ e0\ \[nl2\ index\ \$L0\]\ e1\ \[nl2\ index\ \$L1\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ L\ \$e0\ \$e1\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$L\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ merge-left\ \{L0\ L1\}\ \{\n\ \ \ \ \ \ \ \ if\ \{\[nl2\ is\ left\ \$L0\]\ &&\ \[nl2\ is\ right\ \$L1\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ L\ \[list\ \{\}\]\;\ ::set\ i\ \{\}\n\ \ \ \ \ \ \ \ \ \ \ \ foreach\ x\ \[nl2\ index\ \$L0\]\ y\ \[nl2\ index\ \$L1\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ lset\ L\ 0\ \{*\}\$i\ \[list\ \{\}\ \$x\ \$y\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ i\ \[linsert\ \$i\ 0\ 0\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$L\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl2\ is\ left\ \$L1\]\ &&\ \[nl2\ is\ right\ \$L0\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ L\ \[list\ \{\}\]\;\ ::set\ i\ \{\}\n\ \ \ \ \ \ \ \ \ \ \ \ foreach\ x\ \[nl2\ index\ \$L1\]\ y\ \[nl2\ index\ \$L0\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ lset\ L\ 0\ \{*\}\$i\ \[list\ \{\}\ \$x\ \$y\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ i\ \[linsert\ \$i\ 0\ 0\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$L\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\n\ \ \ \ proc\ merge-right\ \{L0\ L1\}\ \{\n\ \ \ \ \ \ \ \ if\ \{\[nl2\ is\ left\ \$L0\]\ &&\ \[nl2\ is\ right\ \$L1\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ L\ \[list\ \{\}\]\;\ ::set\ i\ \{\}\n\ \ \ \ \ \ \ \ \ \ \ \ foreach\ x\ \[nl2\ index\ \$L0\]\ y\ \[nl2\ index\ \$L1\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ lset\ L\ 0\ \{*\}\$i\ \[list\ \$x\ \$y\ \{\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ i\ \[linsert\ \$i\ 0\ 2\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$L\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl2\ is\ left\ \$L1\]\ &&\ \[nl2\ is\ right\ \$L0\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ L\ \[list\ \{\}\]\;\ ::set\ i\ \{\}\n\ \ \ \ \ \ \ \ \ \ \ \ foreach\ x\ \[nl2\ index\ \$L1\]\ y\ \[nl2\ index\ \$L0\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ lset\ L\ 0\ \{*\}\$i\ \[list\ \$x\ \$y\ \{\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ i\ \[linsert\ \$i\ 0\ 2\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$L\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\n\ \ \ \ proc\ range\ \{L\ debut\ fin\}\ \{\n\ \ \ \ \ \ \ \ #\ nl2\ range\ ...\n\ \ \ \ \ \ \ \ if\ \{\[nl2\ is\ left\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl2\ left\ \{*\}\[::lrange\ \[nl2\ flat\ \$L\]\ \$debut\ \$fin\]\]\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl2\ is\ right\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl2\ right\ \{*\}\[::lrange\ \[nl2\ flat\ \$L\]\ \$debut\ \$fin\]\]\n\ \ \ \ \ \ \ \ \}\ \ \ \n\ \ \ \ \}\n\ \ \ \ namespace\ eval\ repeat\ \{\n\ \ \ \ \ \ \ \ proc\ left\ \{count\ element\ args\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ #\ nl2\ left\ repeat\ ...\n\ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl2\ left\ \{*\}\[lrepeat\ \$count\ \$element\ \{*\}\$args\]\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ proc\ right\ \{count\ element\ args\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ #\ nl2\ left\ repeat\ ...\n\ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl2\ right\ \{*\}\[lrepeat\ \$count\ \$element\ \{*\}\$args\]\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ namespace\ export\ *\n\ \ \ \ \ \ \ \ namespace\ ensemble\ create\n\ \ \ \ \}\n\ \ \ \ proc\ reverse\ \{L\}\ \{\n\ \ \ \ \ \ \ \ #\ nl2\ reverse\ ...\n\ \ \ \ \ \ \ \ if\ \{\[nl2\ is\ left\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \[nl2\ left\ \{*\}\[lreverse\ \[nl2\ flat\ \$L\]\]\]\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl2\ is\ right\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \[nl2\ right\ \{*\}\[lreverse\ \[nl2\ flat\ \$L\]\]\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ right\ \{args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl2\ right\ ...\n\ \ \ \ \ \ \ \ ::set\ L\ \[::list\ \"\"\]\n\ \ \ \ \ \ \ \ ::set\ i\ 0\n\ \ \ \ \ \ \ \ ::foreach\ e\ \$args\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[llength\ \$e\]\ !=\ 1\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \[::list\ \[::list\ \$e\]\ \"\"\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \[::list\ \$e\ \"\"\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ i\ 1\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ ::return\ \{*\}\$L\ \n\ \ \ \ \}\n\ \ \ \ proc\ search\ \{args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl2\ search\ ...\n\ \ \ \ \ \ \ \ ::set\ options\ \[lassign\ \[lreverse\ \$args\]\ pattern\ L\]\n\ \ \ \ \ \ \ \ if\ \{\"-inline\"\ in\ \$options\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[nl2\ is\ left\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl2\ left\ \{*\}\[::lsearch\ \{*\}\$options\ \[nl2\ flat\ \$L\]\ \$pattern\]\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl2\ is\ right\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl2\ right\ \{*\}\[::lsearch\ \{*\}\$options\ \[nl2\ flat\ \$L\]\ \$pattern\]\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[::lsearch\ \{*\}\$options\ \[nl2\ flat\ \$L\]\ \$pattern\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ sort\ \{args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl2\ sort\ ...\n\ \ \ \ \ \ \ \ ::set\ options\ \[lassign\ \[lreverse\ \$args\]\ L\]\n\ \ \ \ \ \ \ \ if\ \{\[nl2\ is\ left\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl2\ left\ \{*\}\[lsort\ \{*\}\$options\ \[nl2\ flat\ \$L\]\]\]\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl2\ is\ right\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl2\ right\ \{*\}\[lsort\ \{*\}\$options\ \[nl2\ flat\ \$L\]\]\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ set\ \{args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl2\ set\ ...\n\ \ \ \ \ \ \ \ ::set\ args\ \[lassign\ \$args\ L\]\n\ \ \ \ \ \ \ \ upvar\ \$L\ nl\n\ \ \ \ \ \ \ \ ::set\ index\ \[lassign\ \[lreverse\ \$args\]\ newValue\]\n\ \ \ \ \ \ \ \ if\ \{\[nl2\ is\ left\ \$nl\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ nl\ \[nl2\ flat\ \$nl\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[::set\ nl\ \[nl2\ left\ \{*\}\[lset\ nl\ \{*\}\$index\ \$newValue\]\]\]\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl2\ is\ right\ \$nl\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ nl\ \[nl2\ flat\ \$nl\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[::set\ nl\ \[nl2\ right\ \{*\}\[lset\ nl\ \{*\}\$index\ \$newValue\]\]\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ transpose\ \{L\}\ \{\n\ \ \ \ \ \ \ \ #\ nl2\ transpose\ ...\n\ \ \ \ \ \ \ \ ::if\ \{\[nl2\ is\ left\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl2\ right\ \{*\}\[nl2\ flat\ \$L\]\]\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl2\ is\ right\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl2\ left\ \{*\}\[nl2\ flat\ \$L\]\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ type\ \{L\}\ \{\n\ \ \ \ \ \ \ \ if\ \{\[nl2\ is\ right\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \"right\"\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl2\ is\ left\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \"left\"\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ !type\ \{L\}\ \{\n\ \ \ \ \ \ \ \ if\ \{\[nl2\ is\ right\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \"left\"\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl2\ is\ left\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \"right\"\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ namespace\ export\ *\n\ \ \ \ namespace\ ensemble\ create\n\}\n\npackage\ provide\ nl2\ 0.1\n======\n****\ Explanation\ and\ Exemples\ of\ nl2\ lists\ ****\n\n<<TOC>>\n\nThe\ nl2\ package\ has\ an\ interface\ that\ is\ close\ to\ that\ of\ \[list\],\ making\ it\ so\ easy\ to\ remember,\ with\ some\ extra\ functionality\ added.\ There\ is\ indoubtly\ some\ bugs,\ please\ tell\ me.\ \n\nLet's\ test\ it\ :\n\n======\npackage\ require\ Tk\nconsole\ show\n\nputs\ \[set\ Left\ \[nl2\ left\ 1\ 2\ 3\]\]\n#\ \{\{\{\}\ 3\}\ 2\}\ 1\nputs\ \[nl2\ is\ left\ \$Left\]\n#\ 1\nputs\ \[nl2\ type\ \$Left\]\n#\ left\nputs\ \[nl2\ !type\ \$Left\]\n#\ right\nputs\ \"index\ 0\ :\ \[nl2\ index\ \$Left\ 0\],\ index\ 1\ :\ \[nl2\ index\ \$Left\ 1\],\ index\ 2\ :\ \[nl2\ index\ \$Left\ 2\],\ index\ all\ :\ \[nl2\ index\ \$Left\]\"\n#\ index\ 0\ :\ 1,\ index\ 1\ :\ 2,\ index\ 2\ :\ 3,\ index\ all\ :\ 1\ 2\ 3\nputs\ \[set\ Right\ \[nl2\ right\ A\ B\ C\]\]\n#\ A\ \{B\ \{C\ \{\}\}\}\nputs\ \[expr\ \{\$Left\ eq\ \$Right\}\]\n#\ 0\n======\n\nThe\ last\ command\ shows\ the\ more\ interesting\ property\ :\ even\ with\ the\ same\ data,\ even\ sorted,\ Left\ nested\ lists\ are\ always\ different\ from\ Right\ nested\ list\ and\ that\ can\ be\ tested.\ It's\ like\ a\ basic\ type,\ since\ extra\ information\ is\ encoded\ in\ the\ structure.\ Each\ kind\ of\ purely\ nested\ list\ could\ be\ seen\ as\ a\ different\ type,\ for\ instance\n\n======\nputs\ \[nl2\ merge\ \$Left\ \$Right\]\n#\ gives\n#\ \{1\ \{2\ \{3\ \{\}\ C\}\ B\}\ A\}\ \n======\n\ni.e.\ a\ beautiful\ purely\ nested\ list\ of\ 3\ constant\ length\ (look\ like\ a\ binary\ tree),\ which\ can\ be\ seen\ as\ another\ pseudo-type,\ different\ from\ 2-length-left-nested\ or\ 2-length-right-nested\ one.\ \nLet's\ imagine\ a\ proc\ which\ is\ use\ to\ configure\ a\ widget.\n****\ Nested\ list\ as\ Pseudo-type\ ****\n\n<<TOC>>\n\n======\ninterp\ alias\ \{\}\ isOptions\ \{\}\ nl2\ is\ left\ninterp\ alias\ \{\}\ isPack\ \{\}\ nl2\ is\ right\n\n\nproc\ confwidget\ \{args\}\ \{\n\ \ \ foreach\ l\ \$args\ \{\n\ \ \ \ \ \ if\ \{\[isOptions\ \$l\]\}\ \{\n\ \ \ \ \ \ \ \ \ puts\ \"widget\ configure\ \{*\}\[nl2\ index\ \$l\]\"\n\ \ \ \ \ \ \}\ elseif\ \{\[isPack\ \$l\]\}\ \{\n\ \ \ \ \ \ \ \ \ puts\ \"pack\ configure\ widget\ \{*\}\[nl2\ index\ \$l\]\"\n\ \ \ \ \ \ \}\ else\ \{\ \ \n\ \ \ \ \ \ \ \ \ foreach\ \{e0\ e1\}\ \$l\ \{\ \n\ \ \ \ \ \ \ \ \ \ \ \ puts\ \"bind\ widget\ \$e0\ \$e1\"\n\ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \}\n\ \ \ \}\n\}\n\nset\ Option\ \[nl2\ left\ -bg\ red\ -borderwidth\ 2\ -relief\ flat\ -text\ hello\]\n#\ \{\{\{\{\{\{\{\{\}\ hello\}\ -text\}\ flat\}\ -relief\}\ 2\}\ -borderwidth\}\ red\}\ -bg\nset\ Pack\ \[nl2\ right\ -after\ Other\ -side\ left\ -expand\ 1\ -fill\ both\]\n#\ -after\ \{Other\ \{-side\ \{left\ \{-expand\ \{1\ \{-fill\ \{both\ \{\}\}\}\}\}\}\}\}\nset\ Bind\ \[dict\ create\ <Button-1>\ \{script1\}\ <Button-2>\ \{script2\}\]\n#\ <Button-1>\ script1\ <Button-2>\ script2\n\nconfwidget\ \$Option\n\n#\ widget\ configure\ \{*\}-bg\ red\ -borderwidth\ 2\ -relief\ flat\ -text\ hello\n\nconfwidget\ \$Pack\n\n#\ pack\ configure\ widget\ \{*\}-after\ Other\ -side\ left\ -expand\ 1\ -fill\ both\n\nconfwidget\ \$Bind\n\n#\ bind\ widget\ <Button-1>\ script1\n#\ bind\ widget\ <Button-2>\ script2\n\n#\ or,\ doing\ with\ all\ kind\ :\n\nconfwidget\ \$Pack\ \$Option\ \$Bind\n\n#\ pack\ configure\ widget\ \{*\}-after\ Other\ -side\ left\ -expand\ 1\ -fill\ both\n#\ widget\ configure\ \{*\}-bg\ red\ -borderwidth\ 2\ -relief\ flat\ -text\ hello\n#\ bind\ widget\ <Button-1>\ script1\n#\ bind\ widget\ <Button-2>\ script2\n\n#\ in\ another\ order\ :\n\nconfwidget\ \$Option\ \$Pack\ \$Bind\n\n#\ widget\ configure\ \{*\}-bg\ red\ -borderwidth\ 2\ -relief\ flat\ -text\ hello\n#\ pack\ configure\ widget\ \{*\}-after\ Other\ -side\ left\ -expand\ 1\ -fill\ both\n#\ bind\ widget\ <Button-1>\ script1\n#\ bind\ widget\ <Button-2>\ script2\n======\nTemporary\ conclusion\ :\ purely\ nested\ lists\ can\ be\ used\ as\ a\ pseudo-type.\ That's\ not\ a\ big\ suprise.\ A\ C-struct\ can\ be\ easily\ indexed,\ and\ also\ verified,\ since\ its\ length\ in\ memory\ is\ constant.\ So\ should\ it\ be\ for\ purely-nested\ list,\ since\ their\ llength\ are\ constant\ (at\ least\ if\ they\ are\ constructed\ with\ a\ \{\}\ terminator).\ At\ each\ level\ of\ representation,\ high\ or\ low,\ this\ is\ the\ regularity\ of\ the\ structure\ which\ helps\ a\ programmer\ to\ deal\ with.\n\n----\n***\ Nested\ list\ of\ constant\ length\ 3\ ***\n\n<<TOC>>\n\n\[FM\]\ Using\ the\ same\ principles,\ here\ is\ an\ interface\ to\ deal\ with\ purely\ nested\ list\ of\ 3\ constant\ llength.\ Such\ \[list\]s\ are\ of\ 3\ kinds\ :\ I\ choose\ to\ name\ them\ left,\ right\ and\ middle.\n\n****\ nl3\ package\ ****\n\n=======\nnamespace\ eval\ nl3\ \{\n\ \ \ \ proc\ append\ \{L\ args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ append\ ...\n\ \ \ \ \ \ \ \ ::upvar\ \$L\ nl\n\ \ \ \ \ \ \ \ ::if\ \{\[::set\ type\ \[nl3\ type\ \$nl\]\]\ ne\ \"\"\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ l\ \[nl3\ flat\ \$nl\]\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ nl\ \[nl3\ \$type\ \{*\}\[lappend\ l\ \{*\}\$args\]\]\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$nl\n\ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ -error\ -message\ \"bad\ list\ type\"\n\ \ \ \ \ \ \ \ \}\ \ \ \ \ \n\ \ \ \ \}\n\n\ \ \ \ proc\ assign\ \{L\ varname\ args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ assign\ ...\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl3\ type\ \$L\]\]\ ne\ \"\"\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \[nl3\ \$type\ \{*\}\[uplevel\ \[subst\ \{lassign\ \{\[nl3\ flat\ \$L\]\}\ \$varname\ \$args\}\]\]\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\ \ \ \ \n\n\ \ \ \ proc\ depth\ \{L\}\ \{\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl3\ type\ \$L\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[expr\ \{\[nl3\ length\ \$L\]/2\}\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ flat\ \{L\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ flat\ ...\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl3\ type\ \$L\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::for\ \{::set\ i\ \{\}\}\ \{\[::llength\ \[::lindex\ \$L\ \{*\}\$i\]\]!=0\}\ \{::set\ i\ \[::linsert\ \$i\ 0\ \[nl3\ rindice\ \$type\]\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ foreach\ j\ \[nl3\ iorder\ \$type\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ Res\ \{*\}\[::lindex\ \$L\ \{*\}\$i\ \$j\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$Res\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\n\ \ \ \ proc\ flat-dict\ \{L\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ flat\ ...\n\ \ \ \ \ \ \ \ ::if\ \{\[nl3\ is\ left\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::for\ \{::set\ i\ \{\}\}\ \{\[::llength\ \[::lindex\ \$L\ \{*\}\$i\]\]!=0\}\ \{::set\ i\ \[::linsert\ \$i\ 0\ 0\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ dict\ set\ Res\ \{*\}\[::lindex\ \$L\ \{*\}\$i\ 2\]\ \{*\}\[::lindex\ \$L\ \{*\}\$i\ 1\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$Res\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl3\ is\ middle\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::for\ \{::set\ i\ \{\}\}\ \{\[::llength\ \[::lindex\ \$L\ \{*\}\$i\]\]!=0\}\ \{::set\ i\ \[::linsert\ \$i\ 0\ 1\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ dict\ set\ Res\ \{*\}\[::lindex\ \$L\ \{*\}\$i\ 0\]\ \{*\}\[::lindex\ \$L\ \{*\}\$i\ 2\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$Res\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl3\ is\ right\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::for\ \{::set\ i\ \{\}\}\ \{\[::llength\ \[::lindex\ \$L\ \{*\}\$i\]\]!=0\}\ \{::set\ i\ \[::linsert\ \$i\ 0\ 2\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ dict\ set\ Res\ \{*\}\[::lindex\ \$L\ \{*\}\$i\ 0\]\ \{*\}\[::lindex\ \$L\ \{*\}\$i\ 1\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$Res\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ \n\ \ \ \ proc\ index\ \{L\ args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ index\ ...\n\ \ \ \ \ \ \ \ ::return\ \[::lindex\ \[nl3\ flat\ \$L\]\ \$args\]\ \ \ \ \ \ \ \ \ \n\ \ \ \ \}\n\n\ \ \ \ proc\ insert\ \{L\ index\ element\ args\}\ \{\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl3\ type\ \$L\]\]\ ne\ \"\"\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl3\ \$type\ \{*\}\[linsert\ \[nl3\ flat\ \$L\]\ \$index\ \$element\ \{*\}\$args\]\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ iorder\ \{type\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ iorder\ ...\n\ \ \ \ \ \ \ \ switch\ --\ \$type\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ left\ \{return\ \[list\ 2\ 1\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ middle\ \{return\ \[list\ 0\ 2\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ right\ \{return\ \[list\ 0\ 1\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ default\ \{return\ \"\"\}\n\ \ \ \ \ \ \ \ \}\ \ \ \n\ \ \ \ \}\n\n\ \ \ \ namespace\ eval\ is\ \{\n\ \ \ \ \ \ \ \ proc\ left\ \{L\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ #\ nl3\ is\ left\ ...\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ ::if\ \{\[::llength\ \$L\]\ ==\ 3\ &&\ \[::llength\ \[::lindex\ \$L\ 0\]\]\ ==\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ elseif\ \{\[::llength\ \$L\]\ ==\ 3\ &&\ \[::llength\ \[::lindex\ \$L\ 0\]\]\ ==\ 3\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ \[nl3\ is\ left\ \[::lindex\ \$L\ 0\]\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ \ \ \ \ \ \ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \}\n\n\ \ \ \ \ \ \ \ proc\ middle\ \{L\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ #\ nl3\ is\ middle\ ...\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ ::if\ \{\[::llength\ \$L\]\ ==\ 3\ &&\ \[::llength\ \[::lindex\ \$L\ 1\]\]\ ==\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ elseif\ \{\[::llength\ \$L\]\ ==\ 3\ &&\ \[::llength\ \[::lindex\ \$L\ 1\]\]\ ==\ 3\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ \[nl3\ is\ middle\ \[::lindex\ \$L\ 1\]\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ \ \n\ \ \ \ \ \ \ \ \}\n\n\ \ \ \ \ \ \ \ proc\ right\ \{L\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ #\ nl3\ is\ right\ ...\ \ \ \ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ ::if\ \{\[::llength\ \$L\]\ ==\ 3\ &&\ \[::llength\ \[::lindex\ \$L\ 2\]\]\ ==\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ elseif\ \{\[::llength\ \$L\]\ ==\ 3\ &&\ \[::llength\ \[::lindex\ \$L\ 2\]\]\ ==\ 3\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ \[nl3\ is\ right\ \[::lindex\ \$L\ 2\]\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ \ \ \n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ namespace\ export\ *\n\ \ \ \ \ \ \ \ namespace\ ensemble\ create\n\ \ \ \ \}\n\n\ \ \ \ proc\ join\ \{L\ \{sz\ \"\ \"\}\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ join\ ...\n\ \ \ \ \ \ \ \ ::join\ \[nl3\ flat\ \$L\]\ \$sz\n\ \ \ \ \}\n\n\ \ \ \ proc\ left\ \{args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ left\ ...\n\ \ \ \ \ \ \ \ ::set\ L\ \[::list\ \"\"\]\n\ \ \ \ \ \ \ \ ::set\ i\ 0\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ ::set\ Reste\ \[expr\ \[llength\ \$args\]%2\]\n\ \ \ \ \ \ \ \ ::foreach\ \{e0\ e1\}\ \[lrange\ \$args\ 0\ end-\$Reste\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::llength\ \$e0\]!=1\}\ \{::set\ e0\ \[list\ \$e0\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::llength\ \$e1\]!=1\}\ \{::set\ e1\ \[list\ \$e1\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \[::list\ \"\"\ \$e1\ \$e0\]\n\ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ i\ 0\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ if\ \{\$Reste\ >\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ lassign\ \[lrange\ \$args\ end-\[expr\ \{\$Reste-1\}\]\ end\]\ e0\ e1\n\ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \[::list\ \"\"\ \$e1\ \$e0\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ ::return\ \{*\}\$L\n\ \ \ \ \}\n\n\ \ \ \ proc\ length\ \{L\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ length\ ...\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl3\ type\ \$L\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[::llength\ \[nl3\ flat\ \$L\]\]\n\ \ \ \ \ \ \ \ \}\ \ \ \ \ \ \ \ \n\ \ \ \ \}\n\ \ \ \ proc\ merge\ \{L0\ L1\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ merge\ ...\n\ \ \ \ \ \ \ \ if\ \{(\[::set\ type0\ \[nl3\ type\ \$L0\]\]\ ne\ \{\})\ &&\ (\[::set\ type1\ \[nl3\ type\ \$L1\]\]\ ne\ \{\})\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ L\ \[::list\ \"\"\]\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ i\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ foreach\ \{e00\ e01\}\ \ \[nl3\ flat\ \$L0\]\ \{e10\ e11\}\ \[nl3\ flat\ \$L1\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::llength\ \$e00\]!=1\}\ \{::set\ e00\ \[list\ \$e00\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::llength\ \$e01\]!=1\}\ \{::set\ e01\ \[list\ \$e01\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::llength\ \$e10\]!=1\}\ \{::set\ e10\ \[list\ \$e10\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::llength\ \$e11\]!=1\}\ \{::set\ e11\ \[list\ \$e11\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ lappend\ TempList\ \$e00\ \$e01\ \$e11\ \$e10\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ TempList\ \[linsert\ \$TempList\ \[::set\ r\ \[expr\ \{\[nl3\ rindice\ \$type0\]+\[nl3\ rindice\ \$type1\]\}\]\]\ \"\"\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \$TempList\n\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ unset\ TempList\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ lappend\ i\ \$r\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \{*\}\$L\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\n\ \ \ \ proc\ middle\ \{args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ middle\ ...\ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ ::set\ L\ \[::list\ \"\"\]\n\ \ \ \ \ \ \ \ ::set\ i\ 0\n\ \ \ \ \ \ \ \ ::set\ Reste\ \[expr\ \[llength\ \$args\]%2\]\n\ \ \ \ \ \ \ \ ::foreach\ \{e0\ e1\}\ \[lrange\ \$args\ 0\ end-\$Reste\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::llength\ \$e0\]!=1\}\ \{::set\ e0\ \[list\ \$e0\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::llength\ \$e1\]!=1\}\ \{::set\ e1\ \[list\ \$e1\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \[::list\ \$e0\ \"\"\ \$e1\]\n\ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ i\ 1\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ if\ \{\$Reste\ >\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ lassign\ \[lrange\ \$args\ end-\[expr\ \{\$Reste-1\}\]\ end\]\ e0\ e1\n\ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \[::list\ \$e0\ \"\"\ \$e1\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ ::return\ \{*\}\$L\ \ \n\ \ \ \ \}\n\n\ \ \ \ proc\ range\ \{L\ début\ fin\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ range\ ...\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl4\ type\ \$L\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl3\ \$type\ \{*\}\[::lrange\ \[nl3\ flat\ \$L\]\ \$debut\ \$fin\]\]\n\ \ \ \ \ \ \ \ \}\ \ \ \ \ \ \ \ \n\ \ \ \ \}\n\ \ \ \ proc\ repeat\ \{type\ count\ args\}\ \{\n\ \ \ \ \ \ \ \ return\ \[nl3\ \$type\ \{*\}\[lrepeat\ \$count\ \{*\}\$args\]\]\n\ \ \ \ \}\n\n\ \ \ \ proc\ nindex\ \{L\ nindex\ \{index\ \{\}\}\}\ \{\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl3\ type\ \$L\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[string\ match\ end*\ \$nindex\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::set\ less\ \[lindex\ \[split\ \$nindex\ -\]\ 1\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ nindex\ \[expr\ \{\[nl3\ depth\ \$L\]-\$less-1\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ nindex\ \[expr\ \{\[nl3\ depth\ \$L\]-1\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ ::for\ \{::set\ I\ 0\;\ ::set\ i\ \{\}\}\ \{\[::llength\ \[::lindex\ \$L\ \{*\}\$i\]\]!=0\}\ \{::set\ i\ \[::linsert\ \$i\ 0\ \[nl3\ rindice\ \$type\]\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\$I\ ==\ \$nindex\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ foreach\ j\ \[nl3\ iorder\ \$type\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ Res\ \{*\}\[::lindex\ \$L\ \{*\}\$i\ \$j\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ \[lindex\ \$Res\ \{*\}\$index\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ incr\ I\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ reverse\ \{L\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ reverse\ ...\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl3\ type\ \$L\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \[nl3\ \$type\ \{*\}\[lreverse\ \[nl3\ flat\ \$L\]\]\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ rindice\ \{type\}\ \{\n\ \ \ \ \ \ \ \ switch\ --\ \$type\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ left\ \{return\ 0\}\n\ \ \ \ \ \ \ \ \ \ \ \ middle\ \{return\ 1\}\n\ \ \ \ \ \ \ \ \ \ \ \ right\ \{return\ 2\}\n\ \ \ \ \ \ \ \ \ \ \ \ default\ \{return\ \"\"\}\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ right\ \{args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ right\ ...\ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ ::set\ L\ \[::list\ \"\"\]\n\ \ \ \ \ \ \ \ ::set\ i\ 0\n\ \ \ \ \ \ \ \ ::set\ Reste\ \[expr\ \[llength\ \$args\]%2\]\n\ \ \ \ \ \ \ \ ::foreach\ \{e0\ e1\}\ \[lrange\ \$args\ 0\ end-\$Reste\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::llength\ \$e0\]!=1\}\ \{::set\ e0\ \[list\ \$e0\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::llength\ \$e1\]!=1\}\ \{::set\ e1\ \[list\ \$e1\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \[::list\ \$e0\ \$e1\ \"\"\]\n\ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ i\ 2\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ if\ \{\$Reste\ >\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ lassign\ \[lrange\ \$args\ end-\[expr\ \{\$Reste-1\}\]\ end\]\ e0\ e1\n\ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \[::list\ \$e0\ \$e1\ \"\"\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ ::return\ \{*\}\$L\ \ \n\ \ \ \ \}\n\ \ \ \ proc\ search\ \{args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ search\ ...\n\ \ \ \ \ \ \ \ ::set\ options\ \[lassign\ \[lreverse\ \$args\]\ pattern\ L\]\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl3\ type\ \$L\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ if\ \{\"-inline\"\ in\ \$options\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl3\ \$type\ \{*\}\[::lsearch\ \{*\}\$options\ \[nl3\ flat\ \$L\]\ \$pattern\]\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[::lsearch\ \{*\}\$options\ \[nl3\ flat\ \$L\]\ \$pattern\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ set\ \{args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ set\ ...\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ ::set\ args\ \[lassign\ \$args\ L\]\n\ \ \ \ \ \ \ \ upvar\ \$L\ nl\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl3\ type\ \$nl\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ index\ \[lassign\ \[lreverse\ \$args\]\ newValue\]\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ nl\ \[nl3\ flat\ \$nl\]\n\ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[::set\ nl\ \[nl3\ \$type\ \{*\}\[lset\ nl\ \{*\}\$index\ \$newValue\]\]\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\n\ \ \ \ proc\ sort\ \{args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ sort\ ...\n\ \ \ \ \ \ \ \ ::set\ options\ \[lassign\ \[lreverse\ \$args\]\ L\]\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl3\ type\ \$L\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl3\ \$type\ \{*\}\[lsort\ \{*\}\$options\ \[nl3\ flat\ \$L\]\]\]\n\ \ \ \ \ \ \ \ \}\ \ \ \ \ \ \ \ \n\ \ \ \ \}\n\n\ \ \ \ proc\ transpose\ \{type\ L\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ transpose\ ...\n\ \ \ \ \ \ \ \ ::return\ \[nl3\ \$type\ \{*\}\[nl3\ flat\ \$L\]\]\n\ \ \ \ \}\n\ \ \ \ proc\ type\ \{L\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ type\ ...\n\ \ \ \ \ \ \ \ if\ \{\[nl3\ is\ left\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \"left\"\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl3\ is\ middle\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \"middle\"\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl3\ is\ right\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \"right\"\n\ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ namespace\ export\ *\n\ \ \ \ namespace\ ensemble\ create\n\}\npackage\ provide\ nl3\ 0.1\n======\n****\ Explanation\ and\ Exemples\ of\ nl3\ lists\ ****\n\nfor\ an\ long\ application,\ see\ \[Trees\ as\ nested\ lists\]\n------\n***\ Nested\ list\ of\ constant\ length\ 4\ (nl4\ package)***\n\n<<TOC>>\n\n\[FM\]\ Using\ the\ same\ principles,\ here\ is\ an\ interface\ to\ deal\ with\ purely\ nested\ list\ of\ 4\ constant\ llength.\ Such\ \[list\]s\ are\ of\ 4\ kinds\ :\ I\ choose\ to\ name\ them\ east,\ north,\ south,\ west.\n****\ nl4\ package\ ****\n======\nnamespace\ eval\ nl4\ \{\n\ \ \ \ proc\ append\ \{L\ args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ append\ ...\n\ \ \ \ \ \ \ \ ::upvar\ \$L\ nl\n\ \ \ \ \ \ \ \ ::if\ \{\[::set\ type\ \[nl4\ type\ \$nl\]\]\ ne\ \"\"\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ l\ \[nl4\ flat\ \$nl\]\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ nl\ \[nl4\ \$type\ \{*\}\[lappend\ l\ \{*\}\$args\]\]\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$nl\n\ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ -error\ -message\ \"bad\ list\ type\"\n\ \ \ \ \ \ \ \ \}\ \ \ \n\ \ \ \ \}\n\ \ \ \ proc\ assign\ \{L\ varname\ args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ assign\ ...\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl4\ type\ \$L\]\]\ ne\ \"\"\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \[nl4\ \$type\ \{*\}\[uplevel\ \[subst\ \{lassign\ \{\[nl4\ flat\ \$L\]\}\ \$varname\ \$args\}\]\]\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ depth\ \{L\}\ \{\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl4\ type\ \$L\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[expr\ \{\[nl4\ length\ \$L\]/3\}\]\n\ \ \ \ \ \ \ \ \}\ \ \ \ \ \ \ \ \n\ \ \ \ \}\n\n\ \ \ \ proc\ east\ \{args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ east\ ...\n\ \ \ \ \ \ \ \ ::set\ L\ \[::list\ \"\"\]\n\ \ \ \ \ \ \ \ ::set\ i\ 0\n\ \ \ \ \ \ \ \ ::set\ Reste\ \[expr\ \[llength\ \$args\]%3\]\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ ::foreach\ \{e0\ e1\ e2\}\ \[lrange\ \$args\ 0\ end-\$Reste\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[llength\ \$e0\]\ !=1\}\ \{::set\ e0\ \[list\ \$e0\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[llength\ \$e1\]\ !=1\}\ \{::set\ e1\ \[list\ \$e1\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[llength\ \$e2\]\ !=1\}\ \{::set\ e2\ \[list\ \$e2\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \[::list\ \$e0\ \$e1\ \$e2\ \"\"\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ i\ 3\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ ::if\ \{\$Reste\ >\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ lassign\ \[lrange\ \$args\ end-\[expr\ \{\$Reste-1\}\]\ end\]\ e0\ e1\ e2\n\ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \[::list\ \$e0\ \$e1\ \$e2\ \"\"\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ ::return\ \{*\}\$L\ \ \ \ \ \ \ \ \n\ \ \ \ \}\n\ \ \ \ proc\ flat\ \{L\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ flat\ ...\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl4\ type\ \$L\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::for\ \{::set\ i\ \{\}\}\ \{\[::llength\ \[::lindex\ \$L\ \{*\}\$i\]\]!=0\}\ \{::set\ i\ \[::linsert\ \$i\ 0\ \[nl4\ rindice\ \$type\]\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ foreach\ j\ \[nl4\ iorder\ \$type\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ Res\ \{*\}\[::lindex\ \$L\ \{*\}\$i\ \$j\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$Res\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ \ \ \ \n\ \ \ \ proc\ index\ \{L\ args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ index\ ...\n\ \ \ \ \ \ \ \ ::return\ \[::lindex\ \[nl4\ flat\ \$L\]\ \$args\]\ \n\ \ \ \ \}\n\n\ \ \ \ proc\ iorder\ \{type\}\ \{\n\ \ \ \ \ \ \ \ switch\ --\ \$type\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ east\ \{return\ \[list\ 0\ 1\ 2\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ north\ \{return\ \[list\ 3\ 2\ 0\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ south\ \{return\ \[list\ 0\ 1\ 3\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ west\ \{return\ \[list\ 3\ 2\ 1\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ default\ \{return\ \"\"\}\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ \ \ \ \ \n\ \ \ \ proc\ insert\ \{L\ index\ element\ args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ insert\ ...\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl4\ type\ \$L\]\]\ ne\ \"\"\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl4\ \$type\ \{*\}\[linsert\ \[nl4\ flat\ \$L\]\ \$index\ \$element\ \{*\}\$args\]\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\n\ \ \ \ namespace\ eval\ is\ \{\n\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ proc\ east\ \{L\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ #\ nl4\ is\ east\ ...\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ ::if\ \{\[::llength\ \$L\]\ ==\ 4\ &&\ \[::llength\ \[::lindex\ \$L\ 3\]\]\ ==\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ elseif\ \{\[::llength\ \$L\]\ ==\ 4\ &&\ \[::llength\ \[::lindex\ \$L\ 3\]\]\ ==\ 4\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ \[nl4\ is\ east\ \[::lindex\ \$L\ 3\]\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ proc\ north\ \{L\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ #\ nl4\ is\ north\ ...\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ ::if\ \{\[::llength\ \$L\]\ ==\ 4\ &&\ \[::llength\ \[::lindex\ \$L\ 1\]\]\ ==\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ elseif\ \{\[::llength\ \$L\]\ ==\ 4\ &&\ \[::llength\ \[::lindex\ \$L\ 1\]\]\ ==\ 4\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ \[nl4\ is\ north\ \[::lindex\ \$L\ 1\]\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ \ \n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ proc\ south\ \{L\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ #\ nl4\ is\ south\ ...\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ ::if\ \{\[::llength\ \$L\]\ ==\ 4\ &&\ \[::llength\ \[::lindex\ \$L\ 2\]\]\ ==\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ elseif\ \{\[::llength\ \$L\]\ ==\ 4\ &&\ \[::llength\ \[::lindex\ \$L\ 2\]\]\ ==\ 4\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ \[nl4\ is\ south\ \[::lindex\ \$L\ 2\]\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ \ \n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ proc\ west\ \{L\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ #\ nl4\ is\ west\ ...\ \ \ \ \ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ ::if\ \{\[::llength\ \$L\]\ ==\ 4\ &&\ \[::llength\ \[::lindex\ \$L\ 0\]\]\ ==\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ elseif\ \{\[::llength\ \$L\]\ ==\ 4\ &&\ \[::llength\ \[::lindex\ \$L\ 0\]\]\ ==\ 4\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ \[nl4\ is\ west\ \[::lindex\ \$L\ 0\]\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ \ \ \ \ \ \ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ namespace\ export\ *\n\ \ \ \ \ \ \ \ namespace\ ensemble\ create\n\ \ \ \ \}\n\ \ \ \ proc\ join\ \{L\ \{sz\ \"\"\}\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ join\ ...\n\ \ \ \ \ \ \ \ return\ \[::join\ \[nl4\ flat\ \$L\]\ \$sz\]\n\ \ \ \ \}\n\n\ \ \ \ proc\ length\ \{L\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ length\ ...\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl4\ type\ \$L\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[::llength\ \[nl4\ flat\ \$L\]\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \n\ \ \ \ \}\n\ \ \ \ proc\ merge\ \{L0\ L1\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ merge\ ...\n\ \ \ \ \ \ \ \ if\ \{(\[::set\ type0\ \[nl4\ type\ \$L0\]\]\ ne\ \{\})\ &&\ (\[::set\ type1\ \[nl4\ type\ \$L1\]\]\ ne\ \{\})\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ L\ \[::list\ \"\"\]\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ i\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ foreach\ \{e00\ e01\ e02\}\ \ \[nl4\ flat\ \$L0\]\ \{e10\ e11\ e12\}\ \[nl4\ flat\ \$L1\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::llength\ \$e00\]!=1\}\ \{::set\ e00\ \[list\ \$e00\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::llength\ \$e01\]!=1\}\ \{::set\ e01\ \[list\ \$e01\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::llength\ \$e02\]!=1\}\ \{::set\ e02\ \[list\ \$e02\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::llength\ \$e10\]!=1\}\ \{::set\ e10\ \[list\ \$e10\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::llength\ \$e11\]!=1\}\ \{::set\ e11\ \[list\ \$e11\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::llength\ \$e12\]!=1\}\ \{::set\ e12\ \[list\ \$e12\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ lappend\ TempList\ \$e00\ \$e01\ \$e02\ \$e12\ \$e11\ \$e10\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ TempList\ \[linsert\ \$TempList\ \[::set\ r\ \[expr\ \{\[nl4\ rindice\ \$type0\]+\[nl4\ rindice\ \$type1\]\}\]\]\ \"\"\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \$TempList\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ lappend\ i\ \$r\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ unset\ TempList\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \{*\}\$L\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\n\ \ \ \ proc\ nindex\ \{L\ nindex\ \{index\ \{\}\}\}\ \{\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl4\ type\ \$L\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[string\ match\ end*\ \$nindex\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::set\ less\ \[lindex\ \[split\ \$nindex\ -\]\ 1\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ nindex\ \[expr\ \{\[nl4\ depth\ \$L\]-\$less-1\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ nindex\ \[expr\ \{\[nl4\ depth\ \$L\]-1\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ ::for\ \{::set\ I\ 0\;\ ::set\ i\ \{\}\}\ \{\[::llength\ \[::lindex\ \$L\ \{*\}\$i\]\]!=0\}\ \{::set\ i\ \[::linsert\ \$i\ 0\ \[nl4\ rindice\ \$type\]\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\$I\ ==\ \$nindex\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ foreach\ j\ \[nl4\ iorder\ \$type\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ Res\ \{*\}\[::lindex\ \$L\ \{*\}\$i\ \$j\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ \[lindex\ \$Res\ \{*\}\$index\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ incr\ I\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ north\ \{args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ north\ ...\n\ \ \ \ \ \ \ \ ::set\ L\ \[::list\ \"\"\]\n\ \ \ \ \ \ \ \ ::set\ i\ 0\n\ \ \ \ \ \ \ \ ::set\ Reste\ \[expr\ \[llength\ \$args\]%3\]\n\ \ \ \ \ \ \ \ ::foreach\ \{e0\ e1\ e2\}\ \[lrange\ \$args\ 0\ end-\$Reste\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[llength\ \$e0\]\ !=1\}\ \{::set\ e0\ \[list\ \$e0\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[llength\ \$e1\]\ !=1\}\ \{::set\ e1\ \[list\ \$e1\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[llength\ \$e2\]\ !=1\}\ \{::set\ e2\ \[list\ \$e2\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \[::list\ \$e2\ \"\"\ \$e1\ \$e0\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ i\ 1\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ ::if\ \{\$Reste\ >\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ lassign\ \[lrange\ \$args\ end-\[expr\ \{\$Reste-1\}\]\ end\]\ e0\ e1\ e2\n\ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \[::list\ \$e2\ \"\"\ \$e1\ \$e0\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ ::return\ \{*\}\$L\n\ \ \ \ \}\n\ \ \ \ proc\ range\ \{L\ debut\ fin\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ range\ ...\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl4\ type\ \$L\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl4\ \$type\ \{*\}\[::lrange\ \[nl4\ flat\ \$L\]\ \$debut\ \$fin\]\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ repeat\ \{type\ count\ args\}\ \{\n\ \ \ \ \ \ \ \ return\ \[nl4\ \$type\ \{*\}\[lrepeat\ \$count\ \{*\}\$args\]\]\n\ \ \ \ \}\n\ \ \ \ proc\ reverse\ \{L\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ reverse\ ...\n\ \ \ \ \ \ \ \ #\ source\ ./nl4/reverse/id.tcl\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl4\ type\ \$L\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \[nl3\ \$type\ \{*\}\[lreverse\ \[nl4\ flat\ \$L\]\]\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\n\ \ \ \ proc\ rindice\ \{type\}\ \{\n\ \ \ \ \ \ \ \ switch\ --\ \$type\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ east\ \{return\ 3\}\n\ \ \ \ \ \ \ \ \ \ \ \ north\ \{return\ 1\}\n\ \ \ \ \ \ \ \ \ \ \ \ south\ \{return\ 2\}\n\ \ \ \ \ \ \ \ \ \ \ \ west\ \{return\ 0\}\n\ \ \ \ \ \ \ \ \ \ \ \ default\ \{return\ \"\"\}\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\n\ \ \ \ proc\ search\ \{args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ search\ ...\n\ \ \ \ \ \ \ \ ::set\ options\ \[lassign\ \[lreverse\ \$args\]\ pattern\ L\]\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl4\ type\ \$L\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ if\ \{\"-around\"\ in\ \$options\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ options\ \[lsearch\ -inline\ -not\ -all\ \$options\ -around\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ allaround\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ allaround\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ if\ \{\"-lindex\"\ ni\ \$options\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\"-inline\"\ in\ \$options\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ options\ \[lsearch\ -inline\ -not\ -all\ \$options\ -inl*\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ Indices\ \[::lsearch\ \{*\}\$options\ \[nl4\ flat\ \$L\]\ \$pattern\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ K\ \[list\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ foreach\ i\ \$Indices\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\$allaround\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ nIndex\ \[expr\ \{\$i/3\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ nIndex\ \[list\ \[expr\ \{\$i/3\}\]\ \[expr\ \{\$i%3\}\]\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ lappend\ K\ \{*\}\[nl4\ nindex\ \$L\ \{*\}\$nIndex\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\$allaround\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ \[nl4\ \$type\ \{*\}\$K\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ \[nl2\ right\ \{*\}\$K\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ Indices\ \[::lsearch\ \{*\}\$options\ \[nl4\ flat\ \$L\]\ \$pattern\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ nIndex\ \[list\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ foreach\ i\ \$Indices\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\$allaround\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ nIndex\ \[expr\ \{\$i/3\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ nIndex\ \[list\ \[expr\ \{\$i/3\}\]\ \[expr\ \{\$i%3\}\]\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ \$nIndex\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\$allaround\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ -error\ \"option\ -around\ and\ -lindex\ not\ allowed\ together\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ options\ \[lsearch\ -inline\ -not\ -all\ \$options\ -lindex\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ \[::lsearch\ \{*\}\$options\ \[nl4\ flat\ \$L\]\ \$pattern\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ set\ \{args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ set\ ...\n\ \ \ \ \ \ \ \ ::set\ args\ \[lassign\ \$args\ L\]\n\ \ \ \ \ \ \ \ upvar\ \$L\ nl\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl4\ type\ \$nl\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ index\ \[lassign\ \[lreverse\ \$args\]\ newValue\]\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ nl\ \[nl4\ flat\ \$nl\]\n\ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[::set\ nl\ \[nl4\ \$type\ \{*\}\[lset\ nl\ \{*\}\$index\ \$newValue\]\]\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\n\ \ \ \ proc\ sort\ \{args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ sort\ ...\n\ \ \ \ \ \ \ \ ::set\ options\ \[lassign\ \[lreverse\ \$args\]\ L\]\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl4\ type\ \$L\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl4\ \$type\ \{*\}\[lsort\ \{*\}\$options\ \[nl4\ flat\ \$L\]\]\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\n\ \ \ \ proc\ south\ \{args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ south\ ...\n\ \ \ \ \ \ \ \ ::set\ L\ \[::list\ \"\"\]\n\ \ \ \ \ \ \ \ ::set\ i\ 0\n\ \ \ \ \ \ \ \ ::set\ Reste\ \[expr\ \[llength\ \$args\]%3\]\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ ::foreach\ \{e0\ e1\ e2\}\ \[lrange\ \$args\ 0\ end-\$Reste\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[llength\ \$e0\]\ !=1\}\ \{::set\ e0\ \[list\ \$e0\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[llength\ \$e1\]\ !=1\}\ \{::set\ e1\ \[list\ \$e1\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[llength\ \$e2\]\ !=1\}\ \{::set\ e2\ \[list\ \$e2\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \[::list\ \$e0\ \$e1\ \"\"\ \$e2\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ i\ 2\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ ::if\ \{\$Reste\ >\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ lassign\ \[lrange\ \$args\ end-\[expr\ \{\$Reste-1\}\]\ end\]\ e0\ e1\ e2\n\ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \[::list\ \$e0\ \$e1\ \"\"\ \$e2\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ ::return\ \{*\}\$L\ \ \ \ \ \ \ \ \n\ \ \ \ \}\n\n\ \ \ \ proc\ transpose\ \{type\ L\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ transpose\ ...\ \ \ \n\ \ \ \ \ \ \ \ ::return\ \[nl4\ \$type\ \{*\}\[nl4\ flat\ \$L\]\]\n\ \ \ \ \}\n\n\ \ \ \ proc\ type\ \{L\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ type\ ...\n\ \ \ \ \ \ \ \ if\ \{\[nl4\ is\ east\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ \"east\"\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl4\ is\ north\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ \"north\"\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl4\ is\ south\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ \"south\"\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl4\ is\ west\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ \"west\"\n\ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \"\"\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\n\ \ \ \ proc\ west\ \{args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ west\ ...\n\ \ \ \ \ \ \ \ ::set\ L\ \[::list\ \"\"\]\n\ \ \ \ \ \ \ \ ::set\ i\ 0\ \n\ \ \ \ \ \ \ \ ::set\ Reste\ \[expr\ \[llength\ \$args\]%3\]\n\ \ \ \ \ \ \ \ ::foreach\ \{e0\ e1\ e2\}\ \[lrange\ \$args\ 0\ end-\$Reste\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[llength\ \$e0\]\ !=1\}\ \{::set\ e0\ \[list\ \$e0\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[llength\ \$e1\]\ !=1\}\ \{::set\ e1\ \[list\ \$e1\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[llength\ \$e2\]\ !=1\}\ \{::set\ e2\ \[list\ \$e2\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \[::list\ \"\"\ \$e2\ \$e1\ \$e0\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ i\ 0\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ ::if\ \{\$Reste\ >\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ lassign\ \[lrange\ \$args\ end-\[expr\ \{\$Reste-1\}\]\ end\]\ e0\ e1\ e2\n\ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \[::list\ \"\"\ \$e2\ \$e1\ \$e0\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ ::return\ \{*\}\$L\n\ \ \ \ \ \ \ \ \n\ \ \ \ \}\n\n\ \ \ \ namespace\ export\ *\n\ \ \ \ namespace\ ensemble\ create\n\}\npackage\ provide\ nl4\ 0.1\n======\n****\ Explanation\ and\ Exemples\ of\ nl4\ lists\ ****\n\n<<TOC>>\n\nFor\ an\ application,\ see\ \[Menu\ as\ trees\ as\ nested\ list\]\n----\n!!!!!!\n%|\ \[Category\ Data\ Structure\]\ |%\n!!!!!! regexp2} CALL {my render {nested list} **\ Introduction\ **\n\nA\ ''nested\ list''\ is\ simply\ a\ list\ that\ occurs\ as\ an\ element\ of\ another\ list\ (which\ may\ of\ course\ itself\ be\ an\ element\ of\ another\ list,\ etc.).\n\n<<TOC>>\n\nCommon\ reasons\ nested\ lists\ arise\ are:\n\ \ \ 1.\ They're\ matrices\ (a\ list\ of\ rows,\ where\ each\ row\ is\ itself\ a\ list,\ or\ a\ list\ of\ columns\ where\ each\ column\ is\ itself\ a\ list).\n\ \ \ 2.\ Lists\ are\ being\ used\ for\ what\ in\ other\ languages\ is\ known\ as\ structs,\ \[record\]s,\ or\ tuples\ --\ collections\ of\ data\ with\ a\ fixed\ structure.\n\ \ \ 3.\ A\ \[tree\]\ is\ encoded\ as\ a\ list\ where\ the\ subtrees\ occur\ as\ elements\ (hence\ lists\ are\ nested\ as\ deeply\ as\ the\ tree\ is\ high).\n\n\[\[Discuss\ when\ using\ a\ nested\ list\ is\ important\ or\ useful\ -\ what\ are\ cases\ where\ it\ is\ a\ good\ solution\]\]\n\nBefore\ Tcl\ 8.4,\ nested\ lists\ were\ quite\ difficult\ to\ work\ with\ --\ getting\ nested\ elements\ required\ nesting\ \[lindex\]\ commands,\ and\ the\ nightmare\ of\ setting\ elements\ in\ nested\ lists\ without\ the\ help\ of\ \[lset\]\ is\ better\ forgotten\ --\ and\ as\ a\ result\ older\ code\ often\ uses\ \[array\]s\ even\ in\ cases\ where\ the\ first-class\ data\ status\ (being\ possible\ to\ pass\ by\ value)\ of\ a\ list\ would\ have\ been\ very\ useful.\ \n\n\n\[\[Discuss\ which\ Tcl\ built\ in\ commands\ can\ be\ used\ to\ build,\ search,\ and\ maintain\ the\ list\]\]\n\n----\n\ \ \ \ *\ \[split\ and\ join\ for\ nested\ lists\]\n\ \ \ \ *\ \[Trees\ as\ nested\ lists\]\n\ \ \ \ *\ \[Nested\ list\ join\]\n\ \ \ \ *\ \[Tables\]\n\ \ \ \ *\ \[Menu\ as\ trees\ as\ nested\ list\]\n----\n**\[LISP\]-style\ lists**\n\nIn\ \[LISP\],\ lists\ are\ built\ by\ linking\ \"cons\ cells\",\ which\ is\ simply\ a\ pair\ of\ values\ (typically\ implemented\ close\ to\ the\ hardware,\ e.g.\ as\ a\ C-struct\ of\ two\ pointers\;\ a\ \[Tcl_Obj\]\ is\ a\ higher\ level\ concept)\ where\ the\ first\ (the\ head)\ by\ convention\ is\ the\ first\ list\ element\ and\ the\ second\ (the\ tail)\ is\ the\ rest\ of\ the\ list\;\ in\ the\ last\ cell\ of\ a\ list\ the\ tail\ pointer\ is\ \[NULL\].\ The\ following\ is\ (yet\ another)\ implementation\ of\ this,\ with\ Tcl\ lists\ of\ length\ 2\ serving\ as\ cons\ cells.\ It\ is\ probably\ not\ of\ any\ practical\ interest.\n\n'''FM''':\ Maybe\ an\ higher\ concept\ level\ has\ some\ higher\ conceptuals\ properties.\ Who\ knows\ ?\ A\ Tcl'ers\ is\ always\ dealing\ with\ such\ things,\ so\ why\ do\ not\ have\ some\ proc\ to\ experiment\ with\ it\ ?\ \n\n***\ Nested\ list\ of\ constant\ length\ 2\ ***\n\n<<TOC>>\n\n****\ nl2\ package\ ****\n======\n#############################\n#\ ensemble\ of\ commands\ \ \ \ \ \ #\n#############################\nset\ nl2\ \{\n\ \ \ \ \ \ \ \{append\ \{append\ at\ the\ end\ of\ the\ 2-length\ nested\ list\ variable\ (like\ lappend)\}\}\n\ \ \ \ \ \ \ \{assign\ \{assign\ each\ member\ of\ the\ 2-length\ nested\ list\ value\ to\ variables\ (like\ lassign)\}\}\n\ \ \ \ \ \ \ \{concat\ \{To\ do\ :\ concat\ for\ list\ work\ on\ non-list\ object\ too,\ so\ I\ haven't\ find\ what\ to\ do\ for\ this\ command\}\}\n\ \ \ \ \ \ \ \{flat\ \{convert\ a\ 2-length\ nested\ list\ value\ as\ a\ flat\ list\}\}\n\ \ \ \ \ \ \ \{index\ \{retrieve\ one\ or\ all\ element\ of\ the\ 2-length\ nested\ list\ value\}\}\n\ \ \ \ \ \ \ \{insert\ \{insert\ one\ element\ at\ the\ place\ specified\ to\ a\ 2-length\ nested\ list\ value\ -\ return\ a\ new\ value\}\}\n\ \ \ \ \ \ \ \ is\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \{left\ \{test\ if\ the\ given\ object\ value\ is\ a\ 2-length\ left\ nested\ list\}\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \{right\ \{test\ if\ the\ given\ object\ value\ is\ a\ 2-length\ right\ nested\ list\}\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \{mixed\ \{test\ if\ the\ given\ object\ value\ is\ a\ 2-length\ left\ nested\ list,\ whose\ elements\ are\ 2-length\ right\ nested\ list\ and\ vice-versa\}\}\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \{join\ \{convert\ the\ nested\ list\ as\ a\ string\ in\ the\ style\ of\ join\ for\ list\}\}\n\ \ \ \ \ \ \ \ \{left\ \{make\ a\ left\ nested\ list\ with\ all\ arguments\}\}\n\ \ \ \ \ \ \ \ \{length\ \{return\ the\ depth\ of\ the\ nested\ list\}\}\n\ \ \ \ \ \ \ \ \{merge\ \{merge\ a\ right\ 2-length\ nested\ list\ with\ a\ left\ 2-length\ nested\ list\ to\ a\ middle\ 3-length\ nested\ list\ \}\}\n\ \ \ \ \ \ \ \ \{merge-left\ \{merge\ a\ right\ 2-length\ nested\ list\ with\ a\ left\ 2-length\ nested\ list\ to\ a\ left\ 3-length\ nested\ list\}\}\n\ \ \ \ \ \ \ \ \{merge-right\ \{merge\ a\ right\ 2-length\ nested\ list\ with\ a\ left\ 2-length\ nested\ list\ to\ a\ left\ 3-length\ nested\ list\}\}\n\ \ \ \ \ \ \ \ \{merge-dict\ \{merge\ a\ right\ 2-length\ nested\ list\ with\ a\ left\ 2-length\ nested\ list\ as\ a\ dict\}\}\n\ \ \ \ \ \ \ \ \{range\ \{return\ a\ range\ of\ elements\ of\ a\ 2-length\ nested\ list\ value\ ans\ return\ it\ as\ nested\ list\}\}\n\ \ \ \ \ \ \ \ repeat\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ left\ \{like\ lrepeat\ but\ make\ a\ left\ 2-length\ nested\ list\}\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ right\ \{like\ lrepeat\ but\ make\ a\ right\ 2-length\ nested\ list\}\}\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \{reverse\ \{reverse\ the\ order\ of\ a\ 2-length\ nested\ list\ value\}\}\n\ \ \ \ \ \ \ \ \{right\ \{make\ a\ left\ nested\ list\ with\ all\ arguments\}\}\n\ \ \ \ \ \ \ \ \{search\ \{like\ lsearch\ for\ 2-length\ nested\ list\}\}\n\ \ \ \ \ \ \ \ \{sort\ \{like\ sort\ for\ 2-length\ nested\ list\}\}\n\ \ \ \ \ \ \ \ \{set\ \{set\ an\ element\ of\ a\ 2-length\ nested\ list\ variable\}\}\n\ \ \ \ \ \ \ \ \{transpose\ \{change\ a\ 2-length\ left\ nested\ list\ value\ in\ a\ 2\ length\ right\ nested\ list\ value\ (and\ vice-versa)\}\}\n\ \ \ \ \ \ \ \ \{type\ \{return\ the\ type\ of\ the\ 2-length\ nested\ list,\ if\ any,\ return\ \"\"\ otherwise\}\}\n\ \ \ \ \ \ \ \ \{!type\}\ \{return\ the\ type\ \"left\"\ for\ a\ right\ 2-length\ nested\ list\ value,\ or\ \"right\"\ for\ a\ left\ 2-length\ nested\ list\}\}\n\}\n\nnamespace\ eval\ nl2\ \{\n\ \ \ \ proc\ append\ \{L\ args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl2\ append\ ...\n\ \ \ \ \ \ \ \ ::upvar\ \$L\ nl\n\ \ \ \ \ \ \ \ ::if\ \{\[nl2\ is\ left\ \$nl\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::for\ \{::set\ i\ 0\}\ \{\[::llength\ \[::lindex\ \$nl\ \{*\}\$i\]\]!=0\}\ \{::lappend\ i\ 0\}\ \{\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lset\ nl\ \{*\}\$i\ \[nl2\ left\ \{*\}\$args\]\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl2\ is\ right\ \$nl\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::for\ \{::set\ i\ 1\}\ \{\[::llength\ \[::lindex\ \$nl\ \{*\}\$i\]\]!=0\}\ \{::lappend\ i\ 1\}\ \{\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lset\ nl\ \{*\}\$i\ \[nl2\ right\ \{*\}\$args\]\n\ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::foreach\ e\ \$args\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ nl\ \$e\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \}\ \ \ \ \ \ \n\ \ \ \ \}\n\ \ \ \ proc\ assign\ \{L\ varname\ args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl2\ assign\ ...\n\ \ \ \ \ \ \ \ if\ \{\[nl2\ is\ left\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \[nl2\ left\ \{*\}\[uplevel\ \[subst\ \{lassign\ \{\[nl2\ flat\ \$L\]\}\ \$varname\ \$args\}\]\]\]\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl2\ is\ right\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \[nl2\ right\ \{*\}\[uplevel\ \[subst\ \{lassign\ \{\[nl2\ flat\ \$L\]\}\ \$varname\ \$args\}\]\]\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ concat\ \{\}\ \{\n\ \ \ \ \ \ \ \ #\ nl2\ concat\ ...\n\ \ \ \ \ \ \ \ #\ to\ do\n\ \ \ \ \}\n\ \ \ \ proc\ flat\ \{L\}\ \{\n\ \ \ \ \ \ \ \ #\ nl2\ flat\ ...\n\ \ \ \ \ \ \ \ ::if\ \{\[nl2\ is\ left\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::for\ \{::set\ i\ 1\}\ \{\[::llength\ \[::lindex\ \$L\ \{*\}\$i\]\]!=0\}\ \{::set\ i\ \[::linsert\ \$i\ 0\ 0\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ Res\ \{*\}\[::lindex\ \$L\ \{*\}\$i\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$Res\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl2\ is\ right\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::for\ \{::set\ i\ 0\}\ \{\[::llength\ \[::lindex\ \$L\ \{*\}\$i\]\]!=0\}\ \{::set\ i\ \[::linsert\ \$i\ 0\ 1\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ Res\ \{*\}\[::lindex\ \$L\ \{*\}\$i\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$Res\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ index\ \{L\ args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl2\ index\ ...\n\ \ \ \ \ \ \ \ ::return\ \[::lindex\ \[nl2\ flat\ \$L\]\ \$args\]\ \ \ \ \ \n\ \ \ \ \}\n\ \ \ \ proc\ insert\ \{L\ index\ element\ args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl2\ insert\ ...\n\ \ \ \ \ \ \ \ if\ \{\[nl2\ is\ left\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl2\ left\ \{*\}\[linsert\ \[nl2\ flat\ \$L\]\ \$index\ \$element\ \{*\}\$args\]\]\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl2\ is\ right\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl2\ right\ \{*\}\[linsert\ \[nl2\ flat\ \$L\]\ \$index\ \$element\ \{*\}\$args\]\]\n\ \ \ \ \ \ \ \ \}\ \ \n\ \ \ \ \}\n\ \ \ \ namespace\ eval\ is\ \{\n\ \ \ \ \ \ \ \ proc\ left\ \{L\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ #\ nl2\ is\ left\ ...\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ ::if\ \{\[::llength\ \$L\]\ ==\ 2\ &&\ \[::llength\ \[::lindex\ \$L\ 0\]\]\ ==\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ elseif\ \{\[::llength\ \$L\]\ ==\ 2\ &&\ \[::llength\ \[::lindex\ \$L\ 0\]\]\ ==\ 2\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ \[nl2\ is\ left\ \[::lindex\ \$L\ 0\]\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ proc\ mixed\ \{L\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ #\ nl2\ is\ mixed\ ...\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl2\ type\ \$L\]\]\ eq\ \"\"\}\ \{return\ \$res\}\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ foreach\ e\ \[nl2\ index\ \$L\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ \[expr\ \{\$res\ &&\ (\[nl2\ !type\ \$e\]\ eq\ \$type)\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$res\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ proc\ right\ \{L\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ #\ nl2\ is\ right\ ...\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ ::if\ \{\[::llength\ \$L\]\ ==\ 2\ &&\ \[::llength\ \[::lindex\ \$L\ 1\]\]\ ==\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ elseif\ \{\[::llength\ \$L\]\ ==\ 2\ &&\ \[::llength\ \[::lindex\ \$L\ 1\]\]\ ==\ 2\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ \[nl2\ is\ right\ \[::lindex\ \$L\ 1\]\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ \ \ \ \ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ namespace\ export\ *\n\ \ \ \ \ \ \ \ namespace\ ensemble\ create\n\ \ \ \ \}\n\ \ \ \ proc\ join\ \{L\ \{sz\ \{\ \}\}\}\ \{\n\ \ \ \ \ \ \ \ #\ nl2\ join\ ...\n\ \ \ \ \ \ \ \ ::join\ \[nl2\ flat\ \$L\]\ \$sz\n\ \ \ \ \}\n\ \ \ \ proc\ left\ \{args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl2\ left\ ...\n\ \ \ \ \ \ \ \ ::set\ L\ \[::list\ \"\"\]\n\ \ \ \ \ \ \ \ ::set\ i\ 0\n\ \ \ \ \ \ \ \ ::foreach\ e\ \$args\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[llength\ \$e\]\ !=\ 1\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \[::list\ \"\"\ \[list\ \$e\]\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \[::list\ \"\"\ \$e\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ i\ 0\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ ::return\ \{*\}\$L\ \ \n\ \ \ \ \}\n\ \ \ \ proc\ length\ \{L\}\ \{\n\ \ \ \ \ \ \ \ #\ nl2\ length\ ...\n\ \ \ \ \ \ \ \ ::set\ j\ 1\n\ \ \ \ \ \ \ \ ::if\ \{\[nl2\ is\ left\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::for\ \{::set\ i\ 0\}\ \{\[::llength\ \[::lindex\ \$L\ \{*\}\$i\]\]!=0\}\ \{::lappend\ i\ 0\;\ incr\ j\}\ \{\}\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl2\ is\ right\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::for\ \{::set\ i\ 1\}\ \{\[::llength\ \[::lindex\ \$L\ \{*\}\$i\]\]!=0\}\ \{::lappend\ i\ 1\;\ incr\ j\}\ \{\}\n\ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ j\ 0\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ ::return\ \$j\n\ \ \ \ \}\n\ \ \ \ proc\ merge\ \{L0\ L1\}\ \{\n\ \ \ \ \ \ \ \ if\ \{\[nl2\ is\ left\ \$L0\]\ &&\ \[nl2\ is\ right\ \$L1\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ L\ \[list\ \{\}\]\;\ ::set\ i\ \{\}\n\ \ \ \ \ \ \ \ \ \ \ \ foreach\ x\ \[nl2\ index\ \$L0\]\ y\ \[nl2\ index\ \$L1\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ lset\ L\ 0\ \{*\}\$i\ \[list\ \$x\ \{\}\ \$y\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ i\ \[linsert\ \$i\ 0\ 1\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$L\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl2\ is\ left\ \$L1\]\ &&\ \[nl2\ is\ right\ \$L0\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ L\ \[list\ \{\}\]\;\ ::set\ i\ \{\}\n\ \ \ \ \ \ \ \ \ \ \ \ foreach\ x\ \[nl2\ index\ \$L1\]\ y\ \[nl2\ index\ \$L0\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ lset\ L\ 0\ \{*\}\$i\ \[list\ \$x\ \{\}\ \$y\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ i\ \[linsert\ \$i\ 0\ 1\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$L\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ merge-dict\ \{L0\ L1\}\ \{\n\ \ \ \ \ \ \ \ if\ \{\[nl2\ is\ left\ \$L0\]\ &&\ \[nl2\ is\ right\ \$L1\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ foreach\ e0\ \[nl2\ index\ \$L0\]\ e1\ \[nl2\ index\ \$L1\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ L\ \$e0\ \$e1\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$L\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl2\ is\ left\ \$L1\]\ &&\ \[nl2\ is\ right\ \$L0\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ foreach\ e0\ \[nl2\ index\ \$L0\]\ e1\ \[nl2\ index\ \$L1\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ L\ \$e0\ \$e1\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$L\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ merge-left\ \{L0\ L1\}\ \{\n\ \ \ \ \ \ \ \ if\ \{\[nl2\ is\ left\ \$L0\]\ &&\ \[nl2\ is\ right\ \$L1\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ L\ \[list\ \{\}\]\;\ ::set\ i\ \{\}\n\ \ \ \ \ \ \ \ \ \ \ \ foreach\ x\ \[nl2\ index\ \$L0\]\ y\ \[nl2\ index\ \$L1\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ lset\ L\ 0\ \{*\}\$i\ \[list\ \{\}\ \$x\ \$y\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ i\ \[linsert\ \$i\ 0\ 0\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$L\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl2\ is\ left\ \$L1\]\ &&\ \[nl2\ is\ right\ \$L0\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ L\ \[list\ \{\}\]\;\ ::set\ i\ \{\}\n\ \ \ \ \ \ \ \ \ \ \ \ foreach\ x\ \[nl2\ index\ \$L1\]\ y\ \[nl2\ index\ \$L0\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ lset\ L\ 0\ \{*\}\$i\ \[list\ \{\}\ \$x\ \$y\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ i\ \[linsert\ \$i\ 0\ 0\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$L\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\n\ \ \ \ proc\ merge-right\ \{L0\ L1\}\ \{\n\ \ \ \ \ \ \ \ if\ \{\[nl2\ is\ left\ \$L0\]\ &&\ \[nl2\ is\ right\ \$L1\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ L\ \[list\ \{\}\]\;\ ::set\ i\ \{\}\n\ \ \ \ \ \ \ \ \ \ \ \ foreach\ x\ \[nl2\ index\ \$L0\]\ y\ \[nl2\ index\ \$L1\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ lset\ L\ 0\ \{*\}\$i\ \[list\ \$x\ \$y\ \{\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ i\ \[linsert\ \$i\ 0\ 2\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$L\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl2\ is\ left\ \$L1\]\ &&\ \[nl2\ is\ right\ \$L0\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ L\ \[list\ \{\}\]\;\ ::set\ i\ \{\}\n\ \ \ \ \ \ \ \ \ \ \ \ foreach\ x\ \[nl2\ index\ \$L1\]\ y\ \[nl2\ index\ \$L0\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ lset\ L\ 0\ \{*\}\$i\ \[list\ \$x\ \$y\ \{\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ i\ \[linsert\ \$i\ 0\ 2\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$L\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\n\ \ \ \ proc\ range\ \{L\ debut\ fin\}\ \{\n\ \ \ \ \ \ \ \ #\ nl2\ range\ ...\n\ \ \ \ \ \ \ \ if\ \{\[nl2\ is\ left\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl2\ left\ \{*\}\[::lrange\ \[nl2\ flat\ \$L\]\ \$debut\ \$fin\]\]\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl2\ is\ right\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl2\ right\ \{*\}\[::lrange\ \[nl2\ flat\ \$L\]\ \$debut\ \$fin\]\]\n\ \ \ \ \ \ \ \ \}\ \ \ \n\ \ \ \ \}\n\ \ \ \ namespace\ eval\ repeat\ \{\n\ \ \ \ \ \ \ \ proc\ left\ \{count\ element\ args\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ #\ nl2\ left\ repeat\ ...\n\ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl2\ left\ \{*\}\[lrepeat\ \$count\ \$element\ \{*\}\$args\]\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ proc\ right\ \{count\ element\ args\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ #\ nl2\ left\ repeat\ ...\n\ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl2\ right\ \{*\}\[lrepeat\ \$count\ \$element\ \{*\}\$args\]\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ namespace\ export\ *\n\ \ \ \ \ \ \ \ namespace\ ensemble\ create\n\ \ \ \ \}\n\ \ \ \ proc\ reverse\ \{L\}\ \{\n\ \ \ \ \ \ \ \ #\ nl2\ reverse\ ...\n\ \ \ \ \ \ \ \ if\ \{\[nl2\ is\ left\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \[nl2\ left\ \{*\}\[lreverse\ \[nl2\ flat\ \$L\]\]\]\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl2\ is\ right\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \[nl2\ right\ \{*\}\[lreverse\ \[nl2\ flat\ \$L\]\]\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ right\ \{args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl2\ right\ ...\n\ \ \ \ \ \ \ \ ::set\ L\ \[::list\ \"\"\]\n\ \ \ \ \ \ \ \ ::set\ i\ 0\n\ \ \ \ \ \ \ \ ::foreach\ e\ \$args\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[llength\ \$e\]\ !=\ 1\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \[::list\ \[::list\ \$e\]\ \"\"\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \[::list\ \$e\ \"\"\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ i\ 1\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ ::return\ \{*\}\$L\ \n\ \ \ \ \}\n\ \ \ \ proc\ search\ \{args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl2\ search\ ...\n\ \ \ \ \ \ \ \ ::set\ options\ \[lassign\ \[lreverse\ \$args\]\ pattern\ L\]\n\ \ \ \ \ \ \ \ if\ \{\"-inline\"\ in\ \$options\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[nl2\ is\ left\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl2\ left\ \{*\}\[::lsearch\ \{*\}\$options\ \[nl2\ flat\ \$L\]\ \$pattern\]\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl2\ is\ right\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl2\ right\ \{*\}\[::lsearch\ \{*\}\$options\ \[nl2\ flat\ \$L\]\ \$pattern\]\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[::lsearch\ \{*\}\$options\ \[nl2\ flat\ \$L\]\ \$pattern\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ sort\ \{args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl2\ sort\ ...\n\ \ \ \ \ \ \ \ ::set\ options\ \[lassign\ \[lreverse\ \$args\]\ L\]\n\ \ \ \ \ \ \ \ if\ \{\[nl2\ is\ left\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl2\ left\ \{*\}\[lsort\ \{*\}\$options\ \[nl2\ flat\ \$L\]\]\]\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl2\ is\ right\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl2\ right\ \{*\}\[lsort\ \{*\}\$options\ \[nl2\ flat\ \$L\]\]\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ set\ \{args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl2\ set\ ...\n\ \ \ \ \ \ \ \ ::set\ args\ \[lassign\ \$args\ L\]\n\ \ \ \ \ \ \ \ upvar\ \$L\ nl\n\ \ \ \ \ \ \ \ ::set\ index\ \[lassign\ \[lreverse\ \$args\]\ newValue\]\n\ \ \ \ \ \ \ \ if\ \{\[nl2\ is\ left\ \$nl\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ nl\ \[nl2\ flat\ \$nl\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[::set\ nl\ \[nl2\ left\ \{*\}\[lset\ nl\ \{*\}\$index\ \$newValue\]\]\]\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl2\ is\ right\ \$nl\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ nl\ \[nl2\ flat\ \$nl\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[::set\ nl\ \[nl2\ right\ \{*\}\[lset\ nl\ \{*\}\$index\ \$newValue\]\]\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ transpose\ \{L\}\ \{\n\ \ \ \ \ \ \ \ #\ nl2\ transpose\ ...\n\ \ \ \ \ \ \ \ ::if\ \{\[nl2\ is\ left\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl2\ right\ \{*\}\[nl2\ flat\ \$L\]\]\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl2\ is\ right\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl2\ left\ \{*\}\[nl2\ flat\ \$L\]\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ type\ \{L\}\ \{\n\ \ \ \ \ \ \ \ if\ \{\[nl2\ is\ right\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \"right\"\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl2\ is\ left\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \"left\"\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ !type\ \{L\}\ \{\n\ \ \ \ \ \ \ \ if\ \{\[nl2\ is\ right\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \"left\"\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl2\ is\ left\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \"right\"\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ namespace\ export\ *\n\ \ \ \ namespace\ ensemble\ create\n\}\n\npackage\ provide\ nl2\ 0.1\n======\n****\ Explanation\ and\ Exemples\ of\ nl2\ lists\ ****\n\n<<TOC>>\n\nThe\ nl2\ package\ has\ an\ interface\ that\ is\ close\ to\ that\ of\ \[list\],\ making\ it\ so\ easy\ to\ remember,\ with\ some\ extra\ functionality\ added.\ There\ is\ indoubtly\ some\ bugs,\ please\ tell\ me.\ \n\nLet's\ test\ it\ :\n\n======\npackage\ require\ Tk\nconsole\ show\n\nputs\ \[set\ Left\ \[nl2\ left\ 1\ 2\ 3\]\]\n#\ \{\{\{\}\ 3\}\ 2\}\ 1\nputs\ \[nl2\ is\ left\ \$Left\]\n#\ 1\nputs\ \[nl2\ type\ \$Left\]\n#\ left\nputs\ \[nl2\ !type\ \$Left\]\n#\ right\nputs\ \"index\ 0\ :\ \[nl2\ index\ \$Left\ 0\],\ index\ 1\ :\ \[nl2\ index\ \$Left\ 1\],\ index\ 2\ :\ \[nl2\ index\ \$Left\ 2\],\ index\ all\ :\ \[nl2\ index\ \$Left\]\"\n#\ index\ 0\ :\ 1,\ index\ 1\ :\ 2,\ index\ 2\ :\ 3,\ index\ all\ :\ 1\ 2\ 3\nputs\ \[set\ Right\ \[nl2\ right\ A\ B\ C\]\]\n#\ A\ \{B\ \{C\ \{\}\}\}\nputs\ \[expr\ \{\$Left\ eq\ \$Right\}\]\n#\ 0\n======\n\nThe\ last\ command\ shows\ the\ more\ interesting\ property\ :\ even\ with\ the\ same\ data,\ even\ sorted,\ Left\ nested\ lists\ are\ always\ different\ from\ Right\ nested\ list\ and\ that\ can\ be\ tested.\ It's\ like\ a\ basic\ type,\ since\ extra\ information\ is\ encoded\ in\ the\ structure.\ Each\ kind\ of\ purely\ nested\ list\ could\ be\ seen\ as\ a\ different\ type,\ for\ instance\n\n======\nputs\ \[nl2\ merge\ \$Left\ \$Right\]\n#\ gives\n#\ \{1\ \{2\ \{3\ \{\}\ C\}\ B\}\ A\}\ \n======\n\ni.e.\ a\ beautiful\ purely\ nested\ list\ of\ 3\ constant\ length\ (look\ like\ a\ binary\ tree),\ which\ can\ be\ seen\ as\ another\ pseudo-type,\ different\ from\ 2-length-left-nested\ or\ 2-length-right-nested\ one.\ \nLet's\ imagine\ a\ proc\ which\ is\ use\ to\ configure\ a\ widget.\n****\ Nested\ list\ as\ Pseudo-type\ ****\n\n<<TOC>>\n\n======\ninterp\ alias\ \{\}\ isOptions\ \{\}\ nl2\ is\ left\ninterp\ alias\ \{\}\ isPack\ \{\}\ nl2\ is\ right\n\n\nproc\ confwidget\ \{args\}\ \{\n\ \ \ foreach\ l\ \$args\ \{\n\ \ \ \ \ \ if\ \{\[isOptions\ \$l\]\}\ \{\n\ \ \ \ \ \ \ \ \ puts\ \"widget\ configure\ \{*\}\[nl2\ index\ \$l\]\"\n\ \ \ \ \ \ \}\ elseif\ \{\[isPack\ \$l\]\}\ \{\n\ \ \ \ \ \ \ \ \ puts\ \"pack\ configure\ widget\ \{*\}\[nl2\ index\ \$l\]\"\n\ \ \ \ \ \ \}\ else\ \{\ \ \n\ \ \ \ \ \ \ \ \ foreach\ \{e0\ e1\}\ \$l\ \{\ \n\ \ \ \ \ \ \ \ \ \ \ \ puts\ \"bind\ widget\ \$e0\ \$e1\"\n\ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \}\n\ \ \ \}\n\}\n\nset\ Option\ \[nl2\ left\ -bg\ red\ -borderwidth\ 2\ -relief\ flat\ -text\ hello\]\n#\ \{\{\{\{\{\{\{\{\}\ hello\}\ -text\}\ flat\}\ -relief\}\ 2\}\ -borderwidth\}\ red\}\ -bg\nset\ Pack\ \[nl2\ right\ -after\ Other\ -side\ left\ -expand\ 1\ -fill\ both\]\n#\ -after\ \{Other\ \{-side\ \{left\ \{-expand\ \{1\ \{-fill\ \{both\ \{\}\}\}\}\}\}\}\}\nset\ Bind\ \[dict\ create\ <Button-1>\ \{script1\}\ <Button-2>\ \{script2\}\]\n#\ <Button-1>\ script1\ <Button-2>\ script2\n\nconfwidget\ \$Option\n\n#\ widget\ configure\ \{*\}-bg\ red\ -borderwidth\ 2\ -relief\ flat\ -text\ hello\n\nconfwidget\ \$Pack\n\n#\ pack\ configure\ widget\ \{*\}-after\ Other\ -side\ left\ -expand\ 1\ -fill\ both\n\nconfwidget\ \$Bind\n\n#\ bind\ widget\ <Button-1>\ script1\n#\ bind\ widget\ <Button-2>\ script2\n\n#\ or,\ doing\ with\ all\ kind\ :\n\nconfwidget\ \$Pack\ \$Option\ \$Bind\n\n#\ pack\ configure\ widget\ \{*\}-after\ Other\ -side\ left\ -expand\ 1\ -fill\ both\n#\ widget\ configure\ \{*\}-bg\ red\ -borderwidth\ 2\ -relief\ flat\ -text\ hello\n#\ bind\ widget\ <Button-1>\ script1\n#\ bind\ widget\ <Button-2>\ script2\n\n#\ in\ another\ order\ :\n\nconfwidget\ \$Option\ \$Pack\ \$Bind\n\n#\ widget\ configure\ \{*\}-bg\ red\ -borderwidth\ 2\ -relief\ flat\ -text\ hello\n#\ pack\ configure\ widget\ \{*\}-after\ Other\ -side\ left\ -expand\ 1\ -fill\ both\n#\ bind\ widget\ <Button-1>\ script1\n#\ bind\ widget\ <Button-2>\ script2\n======\nTemporary\ conclusion\ :\ purely\ nested\ lists\ can\ be\ used\ as\ a\ pseudo-type.\ That's\ not\ a\ big\ suprise.\ A\ C-struct\ can\ be\ easily\ indexed,\ and\ also\ verified,\ since\ its\ length\ in\ memory\ is\ constant.\ So\ should\ it\ be\ for\ purely-nested\ list,\ since\ their\ llength\ are\ constant\ (at\ least\ if\ they\ are\ constructed\ with\ a\ \{\}\ terminator).\ At\ each\ level\ of\ representation,\ high\ or\ low,\ this\ is\ the\ regularity\ of\ the\ structure\ which\ helps\ a\ programmer\ to\ deal\ with.\n\n----\n***\ Nested\ list\ of\ constant\ length\ 3\ ***\n\n<<TOC>>\n\n\[FM\]\ Using\ the\ same\ principles,\ here\ is\ an\ interface\ to\ deal\ with\ purely\ nested\ list\ of\ 3\ constant\ llength.\ Such\ \[list\]s\ are\ of\ 3\ kinds\ :\ I\ choose\ to\ name\ them\ left,\ right\ and\ middle.\n\n****\ nl3\ package\ ****\n\n=======\nnamespace\ eval\ nl3\ \{\n\ \ \ \ proc\ append\ \{L\ args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ append\ ...\n\ \ \ \ \ \ \ \ ::upvar\ \$L\ nl\n\ \ \ \ \ \ \ \ ::if\ \{\[::set\ type\ \[nl3\ type\ \$nl\]\]\ ne\ \"\"\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ l\ \[nl3\ flat\ \$nl\]\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ nl\ \[nl3\ \$type\ \{*\}\[lappend\ l\ \{*\}\$args\]\]\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$nl\n\ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ -error\ -message\ \"bad\ list\ type\"\n\ \ \ \ \ \ \ \ \}\ \ \ \ \ \n\ \ \ \ \}\n\n\ \ \ \ proc\ assign\ \{L\ varname\ args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ assign\ ...\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl3\ type\ \$L\]\]\ ne\ \"\"\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \[nl3\ \$type\ \{*\}\[uplevel\ \[subst\ \{lassign\ \{\[nl3\ flat\ \$L\]\}\ \$varname\ \$args\}\]\]\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\ \ \ \ \n\n\ \ \ \ proc\ depth\ \{L\}\ \{\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl3\ type\ \$L\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[expr\ \{\[nl3\ length\ \$L\]/2\}\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ flat\ \{L\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ flat\ ...\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl3\ type\ \$L\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::for\ \{::set\ i\ \{\}\}\ \{\[::llength\ \[::lindex\ \$L\ \{*\}\$i\]\]!=0\}\ \{::set\ i\ \[::linsert\ \$i\ 0\ \[nl3\ rindice\ \$type\]\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ foreach\ j\ \[nl3\ iorder\ \$type\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ Res\ \{*\}\[::lindex\ \$L\ \{*\}\$i\ \$j\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$Res\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\n\ \ \ \ proc\ flat-dict\ \{L\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ flat\ ...\n\ \ \ \ \ \ \ \ ::if\ \{\[nl3\ is\ left\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::for\ \{::set\ i\ \{\}\}\ \{\[::llength\ \[::lindex\ \$L\ \{*\}\$i\]\]!=0\}\ \{::set\ i\ \[::linsert\ \$i\ 0\ 0\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ dict\ set\ Res\ \{*\}\[::lindex\ \$L\ \{*\}\$i\ 2\]\ \{*\}\[::lindex\ \$L\ \{*\}\$i\ 1\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$Res\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl3\ is\ middle\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::for\ \{::set\ i\ \{\}\}\ \{\[::llength\ \[::lindex\ \$L\ \{*\}\$i\]\]!=0\}\ \{::set\ i\ \[::linsert\ \$i\ 0\ 1\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ dict\ set\ Res\ \{*\}\[::lindex\ \$L\ \{*\}\$i\ 0\]\ \{*\}\[::lindex\ \$L\ \{*\}\$i\ 2\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$Res\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl3\ is\ right\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::for\ \{::set\ i\ \{\}\}\ \{\[::llength\ \[::lindex\ \$L\ \{*\}\$i\]\]!=0\}\ \{::set\ i\ \[::linsert\ \$i\ 0\ 2\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ dict\ set\ Res\ \{*\}\[::lindex\ \$L\ \{*\}\$i\ 0\]\ \{*\}\[::lindex\ \$L\ \{*\}\$i\ 1\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$Res\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ \n\ \ \ \ proc\ index\ \{L\ args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ index\ ...\n\ \ \ \ \ \ \ \ ::return\ \[::lindex\ \[nl3\ flat\ \$L\]\ \$args\]\ \ \ \ \ \ \ \ \ \n\ \ \ \ \}\n\n\ \ \ \ proc\ insert\ \{L\ index\ element\ args\}\ \{\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl3\ type\ \$L\]\]\ ne\ \"\"\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl3\ \$type\ \{*\}\[linsert\ \[nl3\ flat\ \$L\]\ \$index\ \$element\ \{*\}\$args\]\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ iorder\ \{type\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ iorder\ ...\n\ \ \ \ \ \ \ \ switch\ --\ \$type\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ left\ \{return\ \[list\ 2\ 1\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ middle\ \{return\ \[list\ 0\ 2\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ right\ \{return\ \[list\ 0\ 1\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ default\ \{return\ \"\"\}\n\ \ \ \ \ \ \ \ \}\ \ \ \n\ \ \ \ \}\n\n\ \ \ \ namespace\ eval\ is\ \{\n\ \ \ \ \ \ \ \ proc\ left\ \{L\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ #\ nl3\ is\ left\ ...\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ ::if\ \{\[::llength\ \$L\]\ ==\ 3\ &&\ \[::llength\ \[::lindex\ \$L\ 0\]\]\ ==\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ elseif\ \{\[::llength\ \$L\]\ ==\ 3\ &&\ \[::llength\ \[::lindex\ \$L\ 0\]\]\ ==\ 3\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ \[nl3\ is\ left\ \[::lindex\ \$L\ 0\]\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ \ \ \ \ \ \ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \}\n\n\ \ \ \ \ \ \ \ proc\ middle\ \{L\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ #\ nl3\ is\ middle\ ...\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ ::if\ \{\[::llength\ \$L\]\ ==\ 3\ &&\ \[::llength\ \[::lindex\ \$L\ 1\]\]\ ==\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ elseif\ \{\[::llength\ \$L\]\ ==\ 3\ &&\ \[::llength\ \[::lindex\ \$L\ 1\]\]\ ==\ 3\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ \[nl3\ is\ middle\ \[::lindex\ \$L\ 1\]\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ \ \n\ \ \ \ \ \ \ \ \}\n\n\ \ \ \ \ \ \ \ proc\ right\ \{L\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ #\ nl3\ is\ right\ ...\ \ \ \ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ ::if\ \{\[::llength\ \$L\]\ ==\ 3\ &&\ \[::llength\ \[::lindex\ \$L\ 2\]\]\ ==\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ elseif\ \{\[::llength\ \$L\]\ ==\ 3\ &&\ \[::llength\ \[::lindex\ \$L\ 2\]\]\ ==\ 3\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ \[nl3\ is\ right\ \[::lindex\ \$L\ 2\]\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ \ \ \n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ namespace\ export\ *\n\ \ \ \ \ \ \ \ namespace\ ensemble\ create\n\ \ \ \ \}\n\n\ \ \ \ proc\ join\ \{L\ \{sz\ \"\ \"\}\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ join\ ...\n\ \ \ \ \ \ \ \ ::join\ \[nl3\ flat\ \$L\]\ \$sz\n\ \ \ \ \}\n\n\ \ \ \ proc\ left\ \{args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ left\ ...\n\ \ \ \ \ \ \ \ ::set\ L\ \[::list\ \"\"\]\n\ \ \ \ \ \ \ \ ::set\ i\ 0\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ ::set\ Reste\ \[expr\ \[llength\ \$args\]%2\]\n\ \ \ \ \ \ \ \ ::foreach\ \{e0\ e1\}\ \[lrange\ \$args\ 0\ end-\$Reste\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::llength\ \$e0\]!=1\}\ \{::set\ e0\ \[list\ \$e0\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::llength\ \$e1\]!=1\}\ \{::set\ e1\ \[list\ \$e1\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \[::list\ \"\"\ \$e1\ \$e0\]\n\ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ i\ 0\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ if\ \{\$Reste\ >\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ lassign\ \[lrange\ \$args\ end-\[expr\ \{\$Reste-1\}\]\ end\]\ e0\ e1\n\ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \[::list\ \"\"\ \$e1\ \$e0\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ ::return\ \{*\}\$L\n\ \ \ \ \}\n\n\ \ \ \ proc\ length\ \{L\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ length\ ...\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl3\ type\ \$L\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[::llength\ \[nl3\ flat\ \$L\]\]\n\ \ \ \ \ \ \ \ \}\ \ \ \ \ \ \ \ \n\ \ \ \ \}\n\ \ \ \ proc\ merge\ \{L0\ L1\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ merge\ ...\n\ \ \ \ \ \ \ \ if\ \{(\[::set\ type0\ \[nl3\ type\ \$L0\]\]\ ne\ \{\})\ &&\ (\[::set\ type1\ \[nl3\ type\ \$L1\]\]\ ne\ \{\})\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ L\ \[::list\ \"\"\]\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ i\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ foreach\ \{e00\ e01\}\ \ \[nl3\ flat\ \$L0\]\ \{e10\ e11\}\ \[nl3\ flat\ \$L1\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::llength\ \$e00\]!=1\}\ \{::set\ e00\ \[list\ \$e00\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::llength\ \$e01\]!=1\}\ \{::set\ e01\ \[list\ \$e01\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::llength\ \$e10\]!=1\}\ \{::set\ e10\ \[list\ \$e10\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::llength\ \$e11\]!=1\}\ \{::set\ e11\ \[list\ \$e11\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ lappend\ TempList\ \$e00\ \$e01\ \$e11\ \$e10\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ TempList\ \[linsert\ \$TempList\ \[::set\ r\ \[expr\ \{\[nl3\ rindice\ \$type0\]+\[nl3\ rindice\ \$type1\]\}\]\]\ \"\"\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \$TempList\n\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ unset\ TempList\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ lappend\ i\ \$r\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \{*\}\$L\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\n\ \ \ \ proc\ middle\ \{args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ middle\ ...\ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ ::set\ L\ \[::list\ \"\"\]\n\ \ \ \ \ \ \ \ ::set\ i\ 0\n\ \ \ \ \ \ \ \ ::set\ Reste\ \[expr\ \[llength\ \$args\]%2\]\n\ \ \ \ \ \ \ \ ::foreach\ \{e0\ e1\}\ \[lrange\ \$args\ 0\ end-\$Reste\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::llength\ \$e0\]!=1\}\ \{::set\ e0\ \[list\ \$e0\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::llength\ \$e1\]!=1\}\ \{::set\ e1\ \[list\ \$e1\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \[::list\ \$e0\ \"\"\ \$e1\]\n\ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ i\ 1\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ if\ \{\$Reste\ >\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ lassign\ \[lrange\ \$args\ end-\[expr\ \{\$Reste-1\}\]\ end\]\ e0\ e1\n\ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \[::list\ \$e0\ \"\"\ \$e1\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ ::return\ \{*\}\$L\ \ \n\ \ \ \ \}\n\n\ \ \ \ proc\ range\ \{L\ début\ fin\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ range\ ...\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl4\ type\ \$L\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl3\ \$type\ \{*\}\[::lrange\ \[nl3\ flat\ \$L\]\ \$debut\ \$fin\]\]\n\ \ \ \ \ \ \ \ \}\ \ \ \ \ \ \ \ \n\ \ \ \ \}\n\ \ \ \ proc\ repeat\ \{type\ count\ args\}\ \{\n\ \ \ \ \ \ \ \ return\ \[nl3\ \$type\ \{*\}\[lrepeat\ \$count\ \{*\}\$args\]\]\n\ \ \ \ \}\n\n\ \ \ \ proc\ nindex\ \{L\ nindex\ \{index\ \{\}\}\}\ \{\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl3\ type\ \$L\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[string\ match\ end*\ \$nindex\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::set\ less\ \[lindex\ \[split\ \$nindex\ -\]\ 1\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ nindex\ \[expr\ \{\[nl3\ depth\ \$L\]-\$less-1\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ nindex\ \[expr\ \{\[nl3\ depth\ \$L\]-1\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ ::for\ \{::set\ I\ 0\;\ ::set\ i\ \{\}\}\ \{\[::llength\ \[::lindex\ \$L\ \{*\}\$i\]\]!=0\}\ \{::set\ i\ \[::linsert\ \$i\ 0\ \[nl3\ rindice\ \$type\]\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\$I\ ==\ \$nindex\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ foreach\ j\ \[nl3\ iorder\ \$type\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ Res\ \{*\}\[::lindex\ \$L\ \{*\}\$i\ \$j\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ \[lindex\ \$Res\ \{*\}\$index\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ incr\ I\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ reverse\ \{L\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ reverse\ ...\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl3\ type\ \$L\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \[nl3\ \$type\ \{*\}\[lreverse\ \[nl3\ flat\ \$L\]\]\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ rindice\ \{type\}\ \{\n\ \ \ \ \ \ \ \ switch\ --\ \$type\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ left\ \{return\ 0\}\n\ \ \ \ \ \ \ \ \ \ \ \ middle\ \{return\ 1\}\n\ \ \ \ \ \ \ \ \ \ \ \ right\ \{return\ 2\}\n\ \ \ \ \ \ \ \ \ \ \ \ default\ \{return\ \"\"\}\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ right\ \{args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ right\ ...\ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ ::set\ L\ \[::list\ \"\"\]\n\ \ \ \ \ \ \ \ ::set\ i\ 0\n\ \ \ \ \ \ \ \ ::set\ Reste\ \[expr\ \[llength\ \$args\]%2\]\n\ \ \ \ \ \ \ \ ::foreach\ \{e0\ e1\}\ \[lrange\ \$args\ 0\ end-\$Reste\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::llength\ \$e0\]!=1\}\ \{::set\ e0\ \[list\ \$e0\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::llength\ \$e1\]!=1\}\ \{::set\ e1\ \[list\ \$e1\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \[::list\ \$e0\ \$e1\ \"\"\]\n\ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ i\ 2\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ if\ \{\$Reste\ >\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ lassign\ \[lrange\ \$args\ end-\[expr\ \{\$Reste-1\}\]\ end\]\ e0\ e1\n\ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \[::list\ \$e0\ \$e1\ \"\"\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ ::return\ \{*\}\$L\ \ \n\ \ \ \ \}\n\ \ \ \ proc\ search\ \{args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ search\ ...\n\ \ \ \ \ \ \ \ ::set\ options\ \[lassign\ \[lreverse\ \$args\]\ pattern\ L\]\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl3\ type\ \$L\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ if\ \{\"-inline\"\ in\ \$options\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl3\ \$type\ \{*\}\[::lsearch\ \{*\}\$options\ \[nl3\ flat\ \$L\]\ \$pattern\]\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[::lsearch\ \{*\}\$options\ \[nl3\ flat\ \$L\]\ \$pattern\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ set\ \{args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ set\ ...\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ ::set\ args\ \[lassign\ \$args\ L\]\n\ \ \ \ \ \ \ \ upvar\ \$L\ nl\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl3\ type\ \$nl\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ index\ \[lassign\ \[lreverse\ \$args\]\ newValue\]\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ nl\ \[nl3\ flat\ \$nl\]\n\ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[::set\ nl\ \[nl3\ \$type\ \{*\}\[lset\ nl\ \{*\}\$index\ \$newValue\]\]\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\n\ \ \ \ proc\ sort\ \{args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ sort\ ...\n\ \ \ \ \ \ \ \ ::set\ options\ \[lassign\ \[lreverse\ \$args\]\ L\]\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl3\ type\ \$L\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl3\ \$type\ \{*\}\[lsort\ \{*\}\$options\ \[nl3\ flat\ \$L\]\]\]\n\ \ \ \ \ \ \ \ \}\ \ \ \ \ \ \ \ \n\ \ \ \ \}\n\n\ \ \ \ proc\ transpose\ \{type\ L\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ transpose\ ...\n\ \ \ \ \ \ \ \ ::return\ \[nl3\ \$type\ \{*\}\[nl3\ flat\ \$L\]\]\n\ \ \ \ \}\n\ \ \ \ proc\ type\ \{L\}\ \{\n\ \ \ \ \ \ \ \ #\ nl3\ type\ ...\n\ \ \ \ \ \ \ \ if\ \{\[nl3\ is\ left\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \"left\"\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl3\ is\ middle\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \"middle\"\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl3\ is\ right\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \"right\"\n\ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ namespace\ export\ *\n\ \ \ \ namespace\ ensemble\ create\n\}\npackage\ provide\ nl3\ 0.1\n======\n****\ Explanation\ and\ Exemples\ of\ nl3\ lists\ ****\n\nfor\ an\ long\ application,\ see\ \[Trees\ as\ nested\ lists\]\n------\n***\ Nested\ list\ of\ constant\ length\ 4\ (nl4\ package)***\n\n<<TOC>>\n\n\[FM\]\ Using\ the\ same\ principles,\ here\ is\ an\ interface\ to\ deal\ with\ purely\ nested\ list\ of\ 4\ constant\ llength.\ Such\ \[list\]s\ are\ of\ 4\ kinds\ :\ I\ choose\ to\ name\ them\ east,\ north,\ south,\ west.\n****\ nl4\ package\ ****\n======\nnamespace\ eval\ nl4\ \{\n\ \ \ \ proc\ append\ \{L\ args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ append\ ...\n\ \ \ \ \ \ \ \ ::upvar\ \$L\ nl\n\ \ \ \ \ \ \ \ ::if\ \{\[::set\ type\ \[nl4\ type\ \$nl\]\]\ ne\ \"\"\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ l\ \[nl4\ flat\ \$nl\]\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ nl\ \[nl4\ \$type\ \{*\}\[lappend\ l\ \{*\}\$args\]\]\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$nl\n\ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ -error\ -message\ \"bad\ list\ type\"\n\ \ \ \ \ \ \ \ \}\ \ \ \n\ \ \ \ \}\n\ \ \ \ proc\ assign\ \{L\ varname\ args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ assign\ ...\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl4\ type\ \$L\]\]\ ne\ \"\"\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \[nl4\ \$type\ \{*\}\[uplevel\ \[subst\ \{lassign\ \{\[nl4\ flat\ \$L\]\}\ \$varname\ \$args\}\]\]\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ depth\ \{L\}\ \{\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl4\ type\ \$L\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[expr\ \{\[nl4\ length\ \$L\]/3\}\]\n\ \ \ \ \ \ \ \ \}\ \ \ \ \ \ \ \ \n\ \ \ \ \}\n\n\ \ \ \ proc\ east\ \{args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ east\ ...\n\ \ \ \ \ \ \ \ ::set\ L\ \[::list\ \"\"\]\n\ \ \ \ \ \ \ \ ::set\ i\ 0\n\ \ \ \ \ \ \ \ ::set\ Reste\ \[expr\ \[llength\ \$args\]%3\]\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ ::foreach\ \{e0\ e1\ e2\}\ \[lrange\ \$args\ 0\ end-\$Reste\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[llength\ \$e0\]\ !=1\}\ \{::set\ e0\ \[list\ \$e0\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[llength\ \$e1\]\ !=1\}\ \{::set\ e1\ \[list\ \$e1\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[llength\ \$e2\]\ !=1\}\ \{::set\ e2\ \[list\ \$e2\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \[::list\ \$e0\ \$e1\ \$e2\ \"\"\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ i\ 3\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ ::if\ \{\$Reste\ >\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ lassign\ \[lrange\ \$args\ end-\[expr\ \{\$Reste-1\}\]\ end\]\ e0\ e1\ e2\n\ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \[::list\ \$e0\ \$e1\ \$e2\ \"\"\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ ::return\ \{*\}\$L\ \ \ \ \ \ \ \ \n\ \ \ \ \}\n\ \ \ \ proc\ flat\ \{L\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ flat\ ...\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl4\ type\ \$L\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::for\ \{::set\ i\ \{\}\}\ \{\[::llength\ \[::lindex\ \$L\ \{*\}\$i\]\]!=0\}\ \{::set\ i\ \[::linsert\ \$i\ 0\ \[nl4\ rindice\ \$type\]\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ foreach\ j\ \[nl4\ iorder\ \$type\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ Res\ \{*\}\[::lindex\ \$L\ \{*\}\$i\ \$j\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$Res\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ \ \ \ \n\ \ \ \ proc\ index\ \{L\ args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ index\ ...\n\ \ \ \ \ \ \ \ ::return\ \[::lindex\ \[nl4\ flat\ \$L\]\ \$args\]\ \n\ \ \ \ \}\n\n\ \ \ \ proc\ iorder\ \{type\}\ \{\n\ \ \ \ \ \ \ \ switch\ --\ \$type\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ east\ \{return\ \[list\ 0\ 1\ 2\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ north\ \{return\ \[list\ 3\ 2\ 0\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ south\ \{return\ \[list\ 0\ 1\ 3\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ west\ \{return\ \[list\ 3\ 2\ 1\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ default\ \{return\ \"\"\}\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ \ \ \ \ \n\ \ \ \ proc\ insert\ \{L\ index\ element\ args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ insert\ ...\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl4\ type\ \$L\]\]\ ne\ \"\"\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl4\ \$type\ \{*\}\[linsert\ \[nl4\ flat\ \$L\]\ \$index\ \$element\ \{*\}\$args\]\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\n\ \ \ \ namespace\ eval\ is\ \{\n\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ proc\ east\ \{L\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ #\ nl4\ is\ east\ ...\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ ::if\ \{\[::llength\ \$L\]\ ==\ 4\ &&\ \[::llength\ \[::lindex\ \$L\ 3\]\]\ ==\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ elseif\ \{\[::llength\ \$L\]\ ==\ 4\ &&\ \[::llength\ \[::lindex\ \$L\ 3\]\]\ ==\ 4\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ \[nl4\ is\ east\ \[::lindex\ \$L\ 3\]\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ proc\ north\ \{L\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ #\ nl4\ is\ north\ ...\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ ::if\ \{\[::llength\ \$L\]\ ==\ 4\ &&\ \[::llength\ \[::lindex\ \$L\ 1\]\]\ ==\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ elseif\ \{\[::llength\ \$L\]\ ==\ 4\ &&\ \[::llength\ \[::lindex\ \$L\ 1\]\]\ ==\ 4\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ \[nl4\ is\ north\ \[::lindex\ \$L\ 1\]\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ \ \n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ proc\ south\ \{L\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ #\ nl4\ is\ south\ ...\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ ::if\ \{\[::llength\ \$L\]\ ==\ 4\ &&\ \[::llength\ \[::lindex\ \$L\ 2\]\]\ ==\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ elseif\ \{\[::llength\ \$L\]\ ==\ 4\ &&\ \[::llength\ \[::lindex\ \$L\ 2\]\]\ ==\ 4\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ \[nl4\ is\ south\ \[::lindex\ \$L\ 2\]\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ \ \n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ proc\ west\ \{L\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ #\ nl4\ is\ west\ ...\ \ \ \ \ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ ::if\ \{\[::llength\ \$L\]\ ==\ 4\ &&\ \[::llength\ \[::lindex\ \$L\ 0\]\]\ ==\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ elseif\ \{\[::llength\ \$L\]\ ==\ 4\ &&\ \[::llength\ \[::lindex\ \$L\ 0\]\]\ ==\ 4\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ \[nl4\ is\ west\ \[::lindex\ \$L\ 0\]\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ res\ \ \ \ \ \ \ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ namespace\ export\ *\n\ \ \ \ \ \ \ \ namespace\ ensemble\ create\n\ \ \ \ \}\n\ \ \ \ proc\ join\ \{L\ \{sz\ \"\"\}\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ join\ ...\n\ \ \ \ \ \ \ \ return\ \[::join\ \[nl4\ flat\ \$L\]\ \$sz\]\n\ \ \ \ \}\n\n\ \ \ \ proc\ length\ \{L\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ length\ ...\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl4\ type\ \$L\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[::llength\ \[nl4\ flat\ \$L\]\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \n\ \ \ \ \}\n\ \ \ \ proc\ merge\ \{L0\ L1\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ merge\ ...\n\ \ \ \ \ \ \ \ if\ \{(\[::set\ type0\ \[nl4\ type\ \$L0\]\]\ ne\ \{\})\ &&\ (\[::set\ type1\ \[nl4\ type\ \$L1\]\]\ ne\ \{\})\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ L\ \[::list\ \"\"\]\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ i\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ foreach\ \{e00\ e01\ e02\}\ \ \[nl4\ flat\ \$L0\]\ \{e10\ e11\ e12\}\ \[nl4\ flat\ \$L1\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::llength\ \$e00\]!=1\}\ \{::set\ e00\ \[list\ \$e00\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::llength\ \$e01\]!=1\}\ \{::set\ e01\ \[list\ \$e01\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::llength\ \$e02\]!=1\}\ \{::set\ e02\ \[list\ \$e02\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::llength\ \$e10\]!=1\}\ \{::set\ e10\ \[list\ \$e10\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::llength\ \$e11\]!=1\}\ \{::set\ e11\ \[list\ \$e11\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::llength\ \$e12\]!=1\}\ \{::set\ e12\ \[list\ \$e12\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ lappend\ TempList\ \$e00\ \$e01\ \$e02\ \$e12\ \$e11\ \$e10\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ TempList\ \[linsert\ \$TempList\ \[::set\ r\ \[expr\ \{\[nl4\ rindice\ \$type0\]+\[nl4\ rindice\ \$type1\]\}\]\]\ \"\"\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \$TempList\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ lappend\ i\ \$r\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ unset\ TempList\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \{*\}\$L\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\n\ \ \ \ proc\ nindex\ \{L\ nindex\ \{index\ \{\}\}\}\ \{\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl4\ type\ \$L\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[string\ match\ end*\ \$nindex\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[::set\ less\ \[lindex\ \[split\ \$nindex\ -\]\ 1\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ nindex\ \[expr\ \{\[nl4\ depth\ \$L\]-\$less-1\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ nindex\ \[expr\ \{\[nl4\ depth\ \$L\]-1\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ ::for\ \{::set\ I\ 0\;\ ::set\ i\ \{\}\}\ \{\[::llength\ \[::lindex\ \$L\ \{*\}\$i\]\]!=0\}\ \{::set\ i\ \[::linsert\ \$i\ 0\ \[nl4\ rindice\ \$type\]\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\$I\ ==\ \$nindex\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ foreach\ j\ \[nl4\ iorder\ \$type\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ Res\ \{*\}\[::lindex\ \$L\ \{*\}\$i\ \$j\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ \[lindex\ \$Res\ \{*\}\$index\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ incr\ I\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ north\ \{args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ north\ ...\n\ \ \ \ \ \ \ \ ::set\ L\ \[::list\ \"\"\]\n\ \ \ \ \ \ \ \ ::set\ i\ 0\n\ \ \ \ \ \ \ \ ::set\ Reste\ \[expr\ \[llength\ \$args\]%3\]\n\ \ \ \ \ \ \ \ ::foreach\ \{e0\ e1\ e2\}\ \[lrange\ \$args\ 0\ end-\$Reste\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[llength\ \$e0\]\ !=1\}\ \{::set\ e0\ \[list\ \$e0\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[llength\ \$e1\]\ !=1\}\ \{::set\ e1\ \[list\ \$e1\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[llength\ \$e2\]\ !=1\}\ \{::set\ e2\ \[list\ \$e2\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \[::list\ \$e2\ \"\"\ \$e1\ \$e0\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ i\ 1\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ ::if\ \{\$Reste\ >\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ lassign\ \[lrange\ \$args\ end-\[expr\ \{\$Reste-1\}\]\ end\]\ e0\ e1\ e2\n\ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \[::list\ \$e2\ \"\"\ \$e1\ \$e0\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ ::return\ \{*\}\$L\n\ \ \ \ \}\n\ \ \ \ proc\ range\ \{L\ debut\ fin\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ range\ ...\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl4\ type\ \$L\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl4\ \$type\ \{*\}\[::lrange\ \[nl4\ flat\ \$L\]\ \$debut\ \$fin\]\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ repeat\ \{type\ count\ args\}\ \{\n\ \ \ \ \ \ \ \ return\ \[nl4\ \$type\ \{*\}\[lrepeat\ \$count\ \{*\}\$args\]\]\n\ \ \ \ \}\n\ \ \ \ proc\ reverse\ \{L\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ reverse\ ...\n\ \ \ \ \ \ \ \ #\ source\ ./nl4/reverse/id.tcl\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl4\ type\ \$L\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \[nl3\ \$type\ \{*\}\[lreverse\ \[nl4\ flat\ \$L\]\]\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\n\ \ \ \ proc\ rindice\ \{type\}\ \{\n\ \ \ \ \ \ \ \ switch\ --\ \$type\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ east\ \{return\ 3\}\n\ \ \ \ \ \ \ \ \ \ \ \ north\ \{return\ 1\}\n\ \ \ \ \ \ \ \ \ \ \ \ south\ \{return\ 2\}\n\ \ \ \ \ \ \ \ \ \ \ \ west\ \{return\ 0\}\n\ \ \ \ \ \ \ \ \ \ \ \ default\ \{return\ \"\"\}\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\n\ \ \ \ proc\ search\ \{args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ search\ ...\n\ \ \ \ \ \ \ \ ::set\ options\ \[lassign\ \[lreverse\ \$args\]\ pattern\ L\]\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl4\ type\ \$L\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ if\ \{\"-around\"\ in\ \$options\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ options\ \[lsearch\ -inline\ -not\ -all\ \$options\ -around\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ allaround\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ allaround\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ if\ \{\"-lindex\"\ ni\ \$options\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\"-inline\"\ in\ \$options\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ options\ \[lsearch\ -inline\ -not\ -all\ \$options\ -inl*\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ Indices\ \[::lsearch\ \{*\}\$options\ \[nl4\ flat\ \$L\]\ \$pattern\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ K\ \[list\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ foreach\ i\ \$Indices\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\$allaround\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ nIndex\ \[expr\ \{\$i/3\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ nIndex\ \[list\ \[expr\ \{\$i/3\}\]\ \[expr\ \{\$i%3\}\]\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ lappend\ K\ \{*\}\[nl4\ nindex\ \$L\ \{*\}\$nIndex\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\$allaround\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ \[nl4\ \$type\ \{*\}\$K\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ \[nl2\ right\ \{*\}\$K\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ Indices\ \[::lsearch\ \{*\}\$options\ \[nl4\ flat\ \$L\]\ \$pattern\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ nIndex\ \[list\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ foreach\ i\ \$Indices\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\$allaround\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ nIndex\ \[expr\ \{\$i/3\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ nIndex\ \[list\ \[expr\ \{\$i/3\}\]\ \[expr\ \{\$i%3\}\]\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ \$nIndex\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\$allaround\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ -error\ \"option\ -around\ and\ -lindex\ not\ allowed\ together\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::set\ options\ \[lsearch\ -inline\ -not\ -all\ \$options\ -lindex\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ \[::lsearch\ \{*\}\$options\ \[nl4\ flat\ \$L\]\ \$pattern\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ proc\ set\ \{args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ set\ ...\n\ \ \ \ \ \ \ \ ::set\ args\ \[lassign\ \$args\ L\]\n\ \ \ \ \ \ \ \ upvar\ \$L\ nl\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl4\ type\ \$nl\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ index\ \[lassign\ \[lreverse\ \$args\]\ newValue\]\n\ \ \ \ \ \ \ \ \ \ \ \ ::set\ nl\ \[nl4\ flat\ \$nl\]\n\ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[::set\ nl\ \[nl4\ \$type\ \{*\}\[lset\ nl\ \{*\}\$index\ \$newValue\]\]\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\n\ \ \ \ proc\ sort\ \{args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ sort\ ...\n\ \ \ \ \ \ \ \ ::set\ options\ \[lassign\ \[lreverse\ \$args\]\ L\]\n\ \ \ \ \ \ \ \ if\ \{\[::set\ type\ \[nl4\ type\ \$L\]\]\ ne\ \{\}\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ ::return\ \[nl4\ \$type\ \{*\}\[lsort\ \{*\}\$options\ \[nl4\ flat\ \$L\]\]\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\n\ \ \ \ proc\ south\ \{args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ south\ ...\n\ \ \ \ \ \ \ \ ::set\ L\ \[::list\ \"\"\]\n\ \ \ \ \ \ \ \ ::set\ i\ 0\n\ \ \ \ \ \ \ \ ::set\ Reste\ \[expr\ \[llength\ \$args\]%3\]\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ ::foreach\ \{e0\ e1\ e2\}\ \[lrange\ \$args\ 0\ end-\$Reste\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[llength\ \$e0\]\ !=1\}\ \{::set\ e0\ \[list\ \$e0\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[llength\ \$e1\]\ !=1\}\ \{::set\ e1\ \[list\ \$e1\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[llength\ \$e2\]\ !=1\}\ \{::set\ e2\ \[list\ \$e2\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \[::list\ \$e0\ \$e1\ \"\"\ \$e2\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ i\ 2\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ ::if\ \{\$Reste\ >\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ lassign\ \[lrange\ \$args\ end-\[expr\ \{\$Reste-1\}\]\ end\]\ e0\ e1\ e2\n\ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \[::list\ \$e0\ \$e1\ \"\"\ \$e2\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ ::return\ \{*\}\$L\ \ \ \ \ \ \ \ \n\ \ \ \ \}\n\n\ \ \ \ proc\ transpose\ \{type\ L\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ transpose\ ...\ \ \ \n\ \ \ \ \ \ \ \ ::return\ \[nl4\ \$type\ \{*\}\[nl4\ flat\ \$L\]\]\n\ \ \ \ \}\n\n\ \ \ \ proc\ type\ \{L\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ type\ ...\n\ \ \ \ \ \ \ \ if\ \{\[nl4\ is\ east\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ \"east\"\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl4\ is\ north\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ \"north\"\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl4\ is\ south\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ \"south\"\n\ \ \ \ \ \ \ \ \}\ elseif\ \{\[nl4\ is\ west\ \$L\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ \"west\"\n\ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \"\"\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \}\n\n\ \ \ \ proc\ west\ \{args\}\ \{\n\ \ \ \ \ \ \ \ #\ nl4\ west\ ...\n\ \ \ \ \ \ \ \ ::set\ L\ \[::list\ \"\"\]\n\ \ \ \ \ \ \ \ ::set\ i\ 0\ \n\ \ \ \ \ \ \ \ ::set\ Reste\ \[expr\ \[llength\ \$args\]%3\]\n\ \ \ \ \ \ \ \ ::foreach\ \{e0\ e1\ e2\}\ \[lrange\ \$args\ 0\ end-\$Reste\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[llength\ \$e0\]\ !=1\}\ \{::set\ e0\ \[list\ \$e0\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[llength\ \$e1\]\ !=1\}\ \{::set\ e1\ \[list\ \$e1\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[llength\ \$e2\]\ !=1\}\ \{::set\ e2\ \[list\ \$e2\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \[::list\ \"\"\ \$e2\ \$e1\ \$e0\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::lappend\ i\ 0\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ ::if\ \{\$Reste\ >\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ lassign\ \[lrange\ \$args\ end-\[expr\ \{\$Reste-1\}\]\ end\]\ e0\ e1\ e2\n\ \ \ \ \ \ \ \ \ \ \ \ ::lset\ L\ \{*\}\$i\ \[::list\ \"\"\ \$e2\ \$e1\ \$e0\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ ::return\ \{*\}\$L\n\ \ \ \ \ \ \ \ \n\ \ \ \ \}\n\n\ \ \ \ namespace\ export\ *\n\ \ \ \ namespace\ ensemble\ create\n\}\npackage\ provide\ nl4\ 0.1\n======\n****\ Explanation\ and\ Exemples\ of\ nl4\ lists\ ****\n\n<<TOC>>\n\nFor\ an\ application,\ see\ \[Menu\ as\ trees\ as\ nested\ list\]\n----\n!!!!!!\n%|\ \[Category\ Data\ Structure\]\ |%\n!!!!!!} CALL {my revision {nested list}} CALL {::oo::Obj997609 process revision/nested+list} CALL {::oo::Obj997607 process}

-errorcode

NONE

-errorinfo

Unknow state transition: LINE -> END
    while executing
"error $msg"
    (class "::Wiki" method "render_wikit" line 6)
    invoked from within
"my render_$default_markup $N $C $mkup_rendering_engine"
    (class "::Wiki" method "render" line 8)
    invoked from within
"my render $name $C"
    (class "::Wiki" method "revision" line 31)
    invoked from within
"my revision $page"
    (class "::Wiki" method "process" line 56)
    invoked from within
"$server process [string trim $uri /]"

-errorline

4