Error processing request

Parameters

CONTENT_LENGTH0
REQUEST_METHODGET
REQUEST_URI/revision/upvar?V=22
QUERY_STRINGV=22
CONTENT_TYPE
DOCUMENT_URI/revision/upvar
DOCUMENT_ROOT/var/www/nikit/nikit/nginx/../docroot
SCGI1
SERVER_PROTOCOLHTTP/1.1
HTTPSon
REMOTE_ADDR172.69.59.48
REMOTE_PORT14188
SERVER_PORT4443
SERVER_NAMEwiki.tcl-lang.org
HTTP_HOSTwiki.tcl-lang.org
HTTP_CONNECTIONKeep-Alive
HTTP_ACCEPT_ENCODINGgzip, br
HTTP_X_FORWARDED_FOR3.15.27.232
HTTP_CF_RAY87fffaad9ed310bc-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_IP3.15.27.232
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 upvar upvar\ -\ Create\ link\ to\ variable\ in\ a\ different\ stack\ frame\n\nhttp://purl.org/tcl/home/man/tcl8.4/TclCmd/upvar.htm\ .\n\n'''upvar'''\ ''?level?\ otherVar\ myVar\ ?otherVar\ myVar\ ...?''\n\nThis\ command\ arranges\ for\ one\ or\ more\ local\ variables\ in\ the\ current\ procedure\ to\ refer\ to\ variables\ in\ an\ enclosing\ procedure\ call\ or\ to\ global\ variables.\ ''Level''\ may\ have\ any\ of\ the\ forms\ permitted\ for\ the\ '''\[uplevel\]'''\ command,\ and\ may\ be\ omitted\ if\ the\ first\ letter\ of\ the\ first\ ''otherVar''\ isn't\ #\ or\ a\ digit\ (it\ defaults\ to\ 1).\ For\ each\ ''otherVar''\ argument,\ '''upvar'''\ makes\ the\ variable\ by\ that\ name\ in\ the\ procedure\ frame\ given\ by\ ''level''\ (or\ at\ global\ level,\ if\ level\ is\ '''#0''')\ accessible\ in\ the\ current\ procedure\ by\ the\ name\ given\ in\ the\ corresponding\ ''myVar''\ argument.\ The\ variable\ named\ by\ ''otherVar''\ need\ not\ exist\ at\ the\ time\ of\ the\ call\;\ it\ will\ be\ created\ the\ first\ time\ ''myVar''\ is\ referenced,\ just\ like\ an\ ordinary\ variable.\ There\ must\ not\ exist\ a\ variable\ by\ the\ name\ ''myVar''\ at\ the\ time\ '''upvar'''\ is\ invoked.\ ''MyVar''\ is\ always\ treated\ as\ the\ name\ of\ a\ variable,\ not\ an\ array\ element.\ Even\ if\ the\ name\ looks\ like\ an\ array\ element,\ such\ as\ '''a(b)''',\ a\ regular\ variable\ is\ created.\ ''OtherVar''\ may\ refer\ to\ a\ scalar\ variable,\ an\ array,\ or\ an\ array\ element.\ '''Upvar'''\ returns\ an\ empty\ string.\n\nThe\ '''upvar'''\ command\ simplifies\ the\ implementation\ of\ call-by-name\ procedure\ calling\ and\ also\ makes\ it\ easier\ to\ build\ new\ control\ constructs\ as\ Tcl\ procedures.\n`upvar`\ makes\ ''myVar''\ an\ alias\ for\ ''otherVar''.\ ''otherVar''\ can\n----\n\[CMcC\]:\ Could\ someone\ write\ about\ what\ happens\ if\ otherVar\ is\ a\ namespace-qualified\ name?\ \ Does\ a\ fully-qualified\ name\ work?\ \ What\ does\ a\ partially-qualified\ name\ do?\ \n\n\[Lars\ H\]:\ Nothing\ special,\ much\;\ these\ variables\ are\ also\ looked\ up\ according\ \nto\ the\ normal\ rules.\ Fully\ qualified\ names\ are\ straightforward.\ \nPartially\ qualified\ names\ are\ relative\ to\ the\ namespace\ of\ the\ specified\ \n''level'',\ but\ the\ tendency\ of\ partially\ qualified\ names\ to\ bind\ to\ existing\ \nvariables\ that\ are\ relative\ to\ the\ ::\ namespace\ can\ produce\ surprising\ \neffects\ that\ may\ obscure\ this.\n\n----\n\nFrom\ http://www.psg.com/~joem/tcl/faq.html\ I\ see:\n**\ Using\ `\[upvar\]`\ with\ an\ array\ **\nUse\ '''upvar'''\ rather\ than\ try\ to\ use\ '''\[global\]'''\ variables\ when\ possible.\ If\ the\ function\ is\ event\ driven,\ you\ are\ forced\ to\ use\ global\ variables.\n======\n\ \ \ \ #\ print\ elements\ of\ an\ array\n\ \ \ \ proc\ show_array\ arrayName\ \{\n\ \ \ \ \ \ \ \ upvar\ \$arrayName\ myArray\n\ \ \ \ foreach\ element\ \[array\ names\ myArray\]\ \{\n\ \ \ \ \ \ \ \ foreach\ element\ \[array\ names\ myArray\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ puts\ stdout\ \"\$\{arrayName\}(\$element)\ =\ \ \$myArray(\$element)\"\n\ \ \ \ \ \ \ \ \}\n\}\nproc\ main\ \{\}\ \{\n\ \ \ \ set\ arval(0)\ zero\n\ \ \ \ set\ arval(1)\ one\n\ \ \ \ show_array\ arval\n======\nTo\ return\ an\ array\ from\ a\ procedures,\ just\ take\ the\ array\ name\ in\ as\ an\ argument,\ as\ above.\ Any\ changes\ you\ make\ in\ the\ array\ will\ be\ made\ in\ the\ parent's\ array\ as\ well.\n\nExtended\ Tcl\ introduces\ a\ concept\ called\ keyed\ lists\ which\ are\ arrays\ made\ out\ of\ lists\ of\ key-value\ pairs\ and\ can\ be\ passed\ by\ value\ to\ routines,\ over\ networks,\ etc.\n\n----\n\n\[RS\]\ \[upvar\]\ can\ also\ be\ used\ for\ both\ global\ and\ local\ variables:\n\n\ upvar\ #0\ foo\ foo\ \ \;#\ equivalent\ to:\ global\ foo\n\ upvar\ \ 0\ foo\ bar\ \ \;#\ assigns\ alias\ 'bar'\ to\ a\ local\ variable\ 'foo'\nIn\ the\ example\ above,\ any\ changes\ made\ to\ elements\ in\ `\$myArray`\ will\ be\n----\n\nA\ recent\ exchange\ on\ the\ \[AOLserver\]\ mailing\ list\ resulted\ in\ a\ page\ with\ guidelines\ for\ using\ upvar\ and\ \[uplevel\]\ being\ published\ at\ http://dqd.com/~mayoff/notes/tcl/upvar.html\ .\n**\ `upvar`\ prefix*\ for\ Variables\ in\ an\ \[Array\]\ **\n----\n\nSome\ of\ the\ information\ at\ the\ mentioned\ site\ seems\ to\ be\ incorrect.\ Especially\ in\ reference\ to\ uplevel.\nI\ didn't\ look\ at\ in\ great\ detail\ however.\ Does\ this\ advice\ simply\ reflect\ best\ practice\ or\ what\ can\ be\ done?\n======\n----\n\n\ #\ Purpose\ -\n\ #\ \ Utility\ to\ turn\ an\ subset\ of\ an\ array\ into\ alias\ upvar'd\ variables\ for\ local\ function\ use.\n\ #\ \ This\ assumes\ the\ array\ is\ defined\ in\ one\ level\ above\ where\ this\ routine\ is\ called.\n\ #\ \ Todo\ -\n\ #\ \ \ allow\ array\ to\ be\ defined\ at\ other\ levels.\n\ #\ \ \ why\ does\ it\ not\ work\ unless\ I\ quote\ \$\{arName\}(ind)\ with\ \{\}\ ??\n\ #\n\ #\ Right\ now\ the\ source\ array\ has\ to\ be\ in\ the\ global\ level\n\ #\n\ proc\ upAr\ \{\ arName\ index\ \}\ \{\n\ \ upvar\ \$arName\ ar\n\ \ foreach\ ind\ \[array\ names\ ar\ \$\{index\}*\]\ \ \{\n\ \ \ regsub\ \$index\ \$ind\ \{\}\ indVar\n\ \ \ if\ \{\ \[info\ level\ \]\ ==\ 1\ \}\ \{\n\ #\ This\ was\ executed\ from\ level\ 0\ \ \n\ \ \ \ uplevel\ 1\ \[list\ upvar\ #0\ \$\{arName\}(\$ind)\ \$indVar\]\n\ \ \ \}\ else\ \{\n\ \ \ \ uplevel\ 1\ \[list\ upvar\ #0\ \$\{arName\}(\$ind)\ \$indVar\]\ \ \n\ \ \ \}\n\ \ \}\n\ \}\n\[Art\ M.\]\n\n----\n\n\[AMG\]\ I\ like\ that\ ''level''\ is\ optional,\ but\ I\ don't\ like\ the\ method\ used\ to\ identify\ whether\ or\ not\ it\ is\ present.\ \ The\ following\ code\ (an\ in-place\ lsort):\n======\n\ proc\ naive_iplsort\ \{lst\}\ \{\n\ \ \ \ set\ var\ \[lsort\ \$var\]\n\}\n\ \}\nbreaks\ whenever\ `\$lst`\ starts\ with\ `#`\ or\ a\ numeral,\ because\ `\[upvar\]`\ guesses\nbreaks\ whenever\ \$lst\ starts\ with\ #\ or\ a\ numeral,\ since\ \[\[upvar\]\]\ guesses\ that\ its\ first\ parameter\ is\ ''level''\ rather\ than\ ''otherVar''.\n======none\n\ %\ set\ data\ \{4\ 3\ 2\ 1\ 0\}\;\ set\ #0\ \{9\ 8\ 7\ 6\ 5\}\;\ set\ 0a\ \{e\ d\ c\ b\ a\}\n\ %\ naive_iplsort\ data\n\ 0\ 1\ 2\ 3\ 4\n\ %\ naive_iplsort\ #0\n\ wrong\ #\ args:\ should\ be\ \"upvar\ ?level?\ otherVar\ localVar\ ?otherVar\ localVar\ ...?\"\n\ %\ naive_iplsort\ 0a\n\ expected\ integer\ but\ got\ \"0a\"\nThe\ fix\ is\ to\ explicitly\ supply\ ''level'':\nThe\ fix\ is\ explicitly\ supply\ ''level'':\n======\n\ proc\ paranoid_iplsort\ \{lst\}\ \{\n\ \ \ \ set\ var\ \[lsort\ \$var\]\n\}\n\ \}\nThis\ makes\ it\ abundantly\ clear\ to\ Tcl\ that\ `\$lst`\ is\ an\ not\ ''level''\ but\ an\ ''otherVar''\ argument,\ but\ I\ think\ it's\ kind\ of\ painful\ to\ type,\ since\ it\ admits\ that\ Tcl\ has\ the\ feature\ that\ ''level''\ is\ optional,\ but\ that\ feature\ can\ '''never'''\ be\ used\ safely.\ \ At\ least\ it\ works:\nThis\ makes\ it\ abundantly\ clear\ to\ Tcl\ that\ \$lst\ is\ a\ variable\ name\ and\ not\ a\ level.\ \ But\ I\ think\ it's\ kind\ of\ painful\ to\ type,\ since\ it\ admits\ that\ Tcl\ has\ a\ feature\ (''level''\ is\ optional)\ that\ can\ '''never'''\ be\ used\ safely.\ \ At\ least\ it\ works:\n======none\n\ %\ set\ data\ \{4\ 3\ 2\ 1\ 0\}\;\ set\ #0\ \{9\ 8\ 7\ 6\ 5\}\;\ set\ 0a\ \{e\ d\ c\ b\ a\}\n\ %\ paranoid_iplsort\ data\n\ 0\ 1\ 2\ 3\ 4\n\ %\ paranoid_iplsort\ #0\n\ 5\ 6\ 7\ 8\ 9\n\ %\ paranoid_iplsort\ 0a\n\ a\ b\ c\ d\ e\nI\ know\ it\ may\ be\ a\ bit\ too\ late\ to\ change\ this,\ but\ I'd\ prefer\ that\ `\[upvar\]`\nI\ know\ it\ may\ be\ a\ bit\ too\ late\ to\ change\ this,\ but\ I'd\ prefer\ that\ \[\[upvar\]\]\ use\ a\ different\ algorithm\ to\ determine\ whether\ its\ first\ argument\ is\ ''level''\ or\ ''otherVar''.\ \ I'll\ explain\ by\ way\ of\ demonstration:\n======\n\ rename\ upvar\ Upvar\n\ proc\ upvar\ \{args\}\ \{\n\ \ \ \ \ \ \ \ \ #\ Received\ zero\ arguments.\n\ \ \ \ \ \ \ #\ Received\ zero\ arguments.\n\ \ \ \ \ \ \ #\ Allow\ \[upvar\]\ to\ raise\ an\ error.\n\ \ \ \ \ \ \ \ \ #\ Received\ an\ even\ number\ of\ arguments.\n\ \ \ \ \ \ \ #\ Received\ an\ even\ number\ of\ arguments.\n\ \ \ \ \ \ \ #\ Conclude\ that\ the\ first\ is\ a\ variable\ name.\n\ \ \ \ \ \ \ #\ Prepend\ \$args\ with\ the\ default\ level,\ 1.\n\ \ \ \ \ \ \ set\ args\ \[linsert\ \$args\ 0\ 1\]\n\ \ \ \ \ \ \ \ \ #\ Received\ an\ odd\ number\ of\ arguments.\n\ \ \ \ \ \ \ #\ Received\ an\ odd\ number\ of\ arguments.\n\ \ \ \ \ \ \ #\ Conclude\ that\ the\ first\ is\ a\ level\ number.\n\n\ \ \ \ #\ Let\ the\ real\ \[upvar\]\ do\ its\ thing.\n\ \ \ \ uplevel\ 1\ Upvar\ \$args\n\}\n\ \}\nAnd\ a\ test:\n\n======\n\ %\ upvar\ 0\ 0a\ alpha\n\ %\ set\ 0a\ success\;\ puts\ \$alpha\n\ success\n\ %\ proc\ test\ \{\}\ \{upvar\ 0a\ beta\;\ puts\ \$beta\}\n\ %\ test\n\ success\nThis\ should\ also\ work\ in\ the\ case\ of\ multiple\ variable\ pairs.\n\nIronically,\ I\ use\ `\[uplevel\]\ 1`\ in\ the\ above\ code.\ \ `\[uplevel\]`\ has\ a\ similar\nIronically,\ I\ use\ \[\[uplevel\ 1\]\]\ in\ the\ above\ code.\ \ \[\[\[uplevel\]\]\]\ has\ a\ similar\ problem---\ \"Level\ cannot\ be\ defaulted\ if\ the\ first\ command\ argument\ starts\ with\ a\ digit\ or\ #.\"\ \ But\ there's\ no\ possibility\ of\ a\ cutesy\ workaround\ wrapper\ because\ it\ can\ legally\ accept\ ''any''\ number\ of\ arguments,\ whereas\ ''upvar''\ can\ only\ take\ an\ even\ number\ (not\ counting\ ''level'').\nSo\ perhaps\ for\ the\ sake\ of\ consistency\ with\ `\[uplevel\]`\ I\ should\ just\ go\ ahead\nSo\ perhaps\ for\ the\ sake\ of\ consistency\ with\ \[\[uplevel\]\]\ I\ should\ just\ go\ ahead\ and\ put\ those\ blasted\ 1's\ in\ there\ anyway.\ :^)\n\n----\n\n\[\[\n\[Tcl\ syntax\ help\]\ |\n\[Arts\ and\ Crafts\ of\ Tcl-Tk\ Programming\]\n\]\]\n\n\[\[\n\[Category\ Command\]\ |\n\[Category\ Introspection\]\ |\n\[Category\ Control\ Structure\]\n\]\] regexp2} CALL {my render upvar upvar\ -\ Create\ link\ to\ variable\ in\ a\ different\ stack\ frame\n\nhttp://purl.org/tcl/home/man/tcl8.4/TclCmd/upvar.htm\ .\n\n'''upvar'''\ ''?level?\ otherVar\ myVar\ ?otherVar\ myVar\ ...?''\n\nThis\ command\ arranges\ for\ one\ or\ more\ local\ variables\ in\ the\ current\ procedure\ to\ refer\ to\ variables\ in\ an\ enclosing\ procedure\ call\ or\ to\ global\ variables.\ ''Level''\ may\ have\ any\ of\ the\ forms\ permitted\ for\ the\ '''\[uplevel\]'''\ command,\ and\ may\ be\ omitted\ if\ the\ first\ letter\ of\ the\ first\ ''otherVar''\ isn't\ #\ or\ a\ digit\ (it\ defaults\ to\ 1).\ For\ each\ ''otherVar''\ argument,\ '''upvar'''\ makes\ the\ variable\ by\ that\ name\ in\ the\ procedure\ frame\ given\ by\ ''level''\ (or\ at\ global\ level,\ if\ level\ is\ '''#0''')\ accessible\ in\ the\ current\ procedure\ by\ the\ name\ given\ in\ the\ corresponding\ ''myVar''\ argument.\ The\ variable\ named\ by\ ''otherVar''\ need\ not\ exist\ at\ the\ time\ of\ the\ call\;\ it\ will\ be\ created\ the\ first\ time\ ''myVar''\ is\ referenced,\ just\ like\ an\ ordinary\ variable.\ There\ must\ not\ exist\ a\ variable\ by\ the\ name\ ''myVar''\ at\ the\ time\ '''upvar'''\ is\ invoked.\ ''MyVar''\ is\ always\ treated\ as\ the\ name\ of\ a\ variable,\ not\ an\ array\ element.\ Even\ if\ the\ name\ looks\ like\ an\ array\ element,\ such\ as\ '''a(b)''',\ a\ regular\ variable\ is\ created.\ ''OtherVar''\ may\ refer\ to\ a\ scalar\ variable,\ an\ array,\ or\ an\ array\ element.\ '''Upvar'''\ returns\ an\ empty\ string.\n\nThe\ '''upvar'''\ command\ simplifies\ the\ implementation\ of\ call-by-name\ procedure\ calling\ and\ also\ makes\ it\ easier\ to\ build\ new\ control\ constructs\ as\ Tcl\ procedures.\n`upvar`\ makes\ ''myVar''\ an\ alias\ for\ ''otherVar''.\ ''otherVar''\ can\n----\n\[CMcC\]:\ Could\ someone\ write\ about\ what\ happens\ if\ otherVar\ is\ a\ namespace-qualified\ name?\ \ Does\ a\ fully-qualified\ name\ work?\ \ What\ does\ a\ partially-qualified\ name\ do?\ \n\n\[Lars\ H\]:\ Nothing\ special,\ much\;\ these\ variables\ are\ also\ looked\ up\ according\ \nto\ the\ normal\ rules.\ Fully\ qualified\ names\ are\ straightforward.\ \nPartially\ qualified\ names\ are\ relative\ to\ the\ namespace\ of\ the\ specified\ \n''level'',\ but\ the\ tendency\ of\ partially\ qualified\ names\ to\ bind\ to\ existing\ \nvariables\ that\ are\ relative\ to\ the\ ::\ namespace\ can\ produce\ surprising\ \neffects\ that\ may\ obscure\ this.\n\n----\n\nFrom\ http://www.psg.com/~joem/tcl/faq.html\ I\ see:\n**\ Using\ `\[upvar\]`\ with\ an\ array\ **\nUse\ '''upvar'''\ rather\ than\ try\ to\ use\ '''\[global\]'''\ variables\ when\ possible.\ If\ the\ function\ is\ event\ driven,\ you\ are\ forced\ to\ use\ global\ variables.\n======\n\ \ \ \ #\ print\ elements\ of\ an\ array\n\ \ \ \ proc\ show_array\ arrayName\ \{\n\ \ \ \ \ \ \ \ upvar\ \$arrayName\ myArray\n\ \ \ \ foreach\ element\ \[array\ names\ myArray\]\ \{\n\ \ \ \ \ \ \ \ foreach\ element\ \[array\ names\ myArray\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ puts\ stdout\ \"\$\{arrayName\}(\$element)\ =\ \ \$myArray(\$element)\"\n\ \ \ \ \ \ \ \ \}\n\}\nproc\ main\ \{\}\ \{\n\ \ \ \ set\ arval(0)\ zero\n\ \ \ \ set\ arval(1)\ one\n\ \ \ \ show_array\ arval\n======\nTo\ return\ an\ array\ from\ a\ procedures,\ just\ take\ the\ array\ name\ in\ as\ an\ argument,\ as\ above.\ Any\ changes\ you\ make\ in\ the\ array\ will\ be\ made\ in\ the\ parent's\ array\ as\ well.\n\nExtended\ Tcl\ introduces\ a\ concept\ called\ keyed\ lists\ which\ are\ arrays\ made\ out\ of\ lists\ of\ key-value\ pairs\ and\ can\ be\ passed\ by\ value\ to\ routines,\ over\ networks,\ etc.\n\n----\n\n\[RS\]\ \[upvar\]\ can\ also\ be\ used\ for\ both\ global\ and\ local\ variables:\n\n\ upvar\ #0\ foo\ foo\ \ \;#\ equivalent\ to:\ global\ foo\n\ upvar\ \ 0\ foo\ bar\ \ \;#\ assigns\ alias\ 'bar'\ to\ a\ local\ variable\ 'foo'\nIn\ the\ example\ above,\ any\ changes\ made\ to\ elements\ in\ `\$myArray`\ will\ be\n----\n\nA\ recent\ exchange\ on\ the\ \[AOLserver\]\ mailing\ list\ resulted\ in\ a\ page\ with\ guidelines\ for\ using\ upvar\ and\ \[uplevel\]\ being\ published\ at\ http://dqd.com/~mayoff/notes/tcl/upvar.html\ .\n**\ `upvar`\ prefix*\ for\ Variables\ in\ an\ \[Array\]\ **\n----\n\nSome\ of\ the\ information\ at\ the\ mentioned\ site\ seems\ to\ be\ incorrect.\ Especially\ in\ reference\ to\ uplevel.\nI\ didn't\ look\ at\ in\ great\ detail\ however.\ Does\ this\ advice\ simply\ reflect\ best\ practice\ or\ what\ can\ be\ done?\n======\n----\n\n\ #\ Purpose\ -\n\ #\ \ Utility\ to\ turn\ an\ subset\ of\ an\ array\ into\ alias\ upvar'd\ variables\ for\ local\ function\ use.\n\ #\ \ This\ assumes\ the\ array\ is\ defined\ in\ one\ level\ above\ where\ this\ routine\ is\ called.\n\ #\ \ Todo\ -\n\ #\ \ \ allow\ array\ to\ be\ defined\ at\ other\ levels.\n\ #\ \ \ why\ does\ it\ not\ work\ unless\ I\ quote\ \$\{arName\}(ind)\ with\ \{\}\ ??\n\ #\n\ #\ Right\ now\ the\ source\ array\ has\ to\ be\ in\ the\ global\ level\n\ #\n\ proc\ upAr\ \{\ arName\ index\ \}\ \{\n\ \ upvar\ \$arName\ ar\n\ \ foreach\ ind\ \[array\ names\ ar\ \$\{index\}*\]\ \ \{\n\ \ \ regsub\ \$index\ \$ind\ \{\}\ indVar\n\ \ \ if\ \{\ \[info\ level\ \]\ ==\ 1\ \}\ \{\n\ #\ This\ was\ executed\ from\ level\ 0\ \ \n\ \ \ \ uplevel\ 1\ \[list\ upvar\ #0\ \$\{arName\}(\$ind)\ \$indVar\]\n\ \ \ \}\ else\ \{\n\ \ \ \ uplevel\ 1\ \[list\ upvar\ #0\ \$\{arName\}(\$ind)\ \$indVar\]\ \ \n\ \ \ \}\n\ \ \}\n\ \}\n\[Art\ M.\]\n\n----\n\n\[AMG\]\ I\ like\ that\ ''level''\ is\ optional,\ but\ I\ don't\ like\ the\ method\ used\ to\ identify\ whether\ or\ not\ it\ is\ present.\ \ The\ following\ code\ (an\ in-place\ lsort):\n======\n\ proc\ naive_iplsort\ \{lst\}\ \{\n\ \ \ \ set\ var\ \[lsort\ \$var\]\n\}\n\ \}\nbreaks\ whenever\ `\$lst`\ starts\ with\ `#`\ or\ a\ numeral,\ because\ `\[upvar\]`\ guesses\nbreaks\ whenever\ \$lst\ starts\ with\ #\ or\ a\ numeral,\ since\ \[\[upvar\]\]\ guesses\ that\ its\ first\ parameter\ is\ ''level''\ rather\ than\ ''otherVar''.\n======none\n\ %\ set\ data\ \{4\ 3\ 2\ 1\ 0\}\;\ set\ #0\ \{9\ 8\ 7\ 6\ 5\}\;\ set\ 0a\ \{e\ d\ c\ b\ a\}\n\ %\ naive_iplsort\ data\n\ 0\ 1\ 2\ 3\ 4\n\ %\ naive_iplsort\ #0\n\ wrong\ #\ args:\ should\ be\ \"upvar\ ?level?\ otherVar\ localVar\ ?otherVar\ localVar\ ...?\"\n\ %\ naive_iplsort\ 0a\n\ expected\ integer\ but\ got\ \"0a\"\nThe\ fix\ is\ to\ explicitly\ supply\ ''level'':\nThe\ fix\ is\ explicitly\ supply\ ''level'':\n======\n\ proc\ paranoid_iplsort\ \{lst\}\ \{\n\ \ \ \ set\ var\ \[lsort\ \$var\]\n\}\n\ \}\nThis\ makes\ it\ abundantly\ clear\ to\ Tcl\ that\ `\$lst`\ is\ an\ not\ ''level''\ but\ an\ ''otherVar''\ argument,\ but\ I\ think\ it's\ kind\ of\ painful\ to\ type,\ since\ it\ admits\ that\ Tcl\ has\ the\ feature\ that\ ''level''\ is\ optional,\ but\ that\ feature\ can\ '''never'''\ be\ used\ safely.\ \ At\ least\ it\ works:\nThis\ makes\ it\ abundantly\ clear\ to\ Tcl\ that\ \$lst\ is\ a\ variable\ name\ and\ not\ a\ level.\ \ But\ I\ think\ it's\ kind\ of\ painful\ to\ type,\ since\ it\ admits\ that\ Tcl\ has\ a\ feature\ (''level''\ is\ optional)\ that\ can\ '''never'''\ be\ used\ safely.\ \ At\ least\ it\ works:\n======none\n\ %\ set\ data\ \{4\ 3\ 2\ 1\ 0\}\;\ set\ #0\ \{9\ 8\ 7\ 6\ 5\}\;\ set\ 0a\ \{e\ d\ c\ b\ a\}\n\ %\ paranoid_iplsort\ data\n\ 0\ 1\ 2\ 3\ 4\n\ %\ paranoid_iplsort\ #0\n\ 5\ 6\ 7\ 8\ 9\n\ %\ paranoid_iplsort\ 0a\n\ a\ b\ c\ d\ e\nI\ know\ it\ may\ be\ a\ bit\ too\ late\ to\ change\ this,\ but\ I'd\ prefer\ that\ `\[upvar\]`\nI\ know\ it\ may\ be\ a\ bit\ too\ late\ to\ change\ this,\ but\ I'd\ prefer\ that\ \[\[upvar\]\]\ use\ a\ different\ algorithm\ to\ determine\ whether\ its\ first\ argument\ is\ ''level''\ or\ ''otherVar''.\ \ I'll\ explain\ by\ way\ of\ demonstration:\n======\n\ rename\ upvar\ Upvar\n\ proc\ upvar\ \{args\}\ \{\n\ \ \ \ \ \ \ \ \ #\ Received\ zero\ arguments.\n\ \ \ \ \ \ \ #\ Received\ zero\ arguments.\n\ \ \ \ \ \ \ #\ Allow\ \[upvar\]\ to\ raise\ an\ error.\n\ \ \ \ \ \ \ \ \ #\ Received\ an\ even\ number\ of\ arguments.\n\ \ \ \ \ \ \ #\ Received\ an\ even\ number\ of\ arguments.\n\ \ \ \ \ \ \ #\ Conclude\ that\ the\ first\ is\ a\ variable\ name.\n\ \ \ \ \ \ \ #\ Prepend\ \$args\ with\ the\ default\ level,\ 1.\n\ \ \ \ \ \ \ set\ args\ \[linsert\ \$args\ 0\ 1\]\n\ \ \ \ \ \ \ \ \ #\ Received\ an\ odd\ number\ of\ arguments.\n\ \ \ \ \ \ \ #\ Received\ an\ odd\ number\ of\ arguments.\n\ \ \ \ \ \ \ #\ Conclude\ that\ the\ first\ is\ a\ level\ number.\n\n\ \ \ \ #\ Let\ the\ real\ \[upvar\]\ do\ its\ thing.\n\ \ \ \ uplevel\ 1\ Upvar\ \$args\n\}\n\ \}\nAnd\ a\ test:\n\n======\n\ %\ upvar\ 0\ 0a\ alpha\n\ %\ set\ 0a\ success\;\ puts\ \$alpha\n\ success\n\ %\ proc\ test\ \{\}\ \{upvar\ 0a\ beta\;\ puts\ \$beta\}\n\ %\ test\n\ success\nThis\ should\ also\ work\ in\ the\ case\ of\ multiple\ variable\ pairs.\n\nIronically,\ I\ use\ `\[uplevel\]\ 1`\ in\ the\ above\ code.\ \ `\[uplevel\]`\ has\ a\ similar\nIronically,\ I\ use\ \[\[uplevel\ 1\]\]\ in\ the\ above\ code.\ \ \[\[\[uplevel\]\]\]\ has\ a\ similar\ problem---\ \"Level\ cannot\ be\ defaulted\ if\ the\ first\ command\ argument\ starts\ with\ a\ digit\ or\ #.\"\ \ But\ there's\ no\ possibility\ of\ a\ cutesy\ workaround\ wrapper\ because\ it\ can\ legally\ accept\ ''any''\ number\ of\ arguments,\ whereas\ ''upvar''\ can\ only\ take\ an\ even\ number\ (not\ counting\ ''level'').\nSo\ perhaps\ for\ the\ sake\ of\ consistency\ with\ `\[uplevel\]`\ I\ should\ just\ go\ ahead\nSo\ perhaps\ for\ the\ sake\ of\ consistency\ with\ \[\[uplevel\]\]\ I\ should\ just\ go\ ahead\ and\ put\ those\ blasted\ 1's\ in\ there\ anyway.\ :^)\n\n----\n\n\[\[\n\[Tcl\ syntax\ help\]\ |\n\[Arts\ and\ Crafts\ of\ Tcl-Tk\ Programming\]\n\]\]\n\n\[\[\n\[Category\ Command\]\ |\n\[Category\ Introspection\]\ |\n\[Category\ Control\ Structure\]\n\]\]} CALL {my revision upvar} CALL {::oo::Obj7305279 process revision/upvar} CALL {::oo::Obj7305277 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