Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Rich Newsgroups: comp.lang.tcl Subject: Re: tcl hidden "cruelties" Date: Mon, 14 Oct 2024 01:44:31 -0000 (UTC) Organization: A noiseless patient Spider Lines: 44 Message-ID: References: Injection-Date: Mon, 14 Oct 2024 03:44:31 +0200 (CEST) Injection-Info: dont-email.me; posting-host="cc5d4c666b466bfc5100f8b5eadc1ad0"; logging-data="960088"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX19tI7iT0d00voryDRTvL0ZE" User-Agent: tin/2.6.1-20211226 ("Convalmore") (Linux/5.15.139 (x86_64)) Cancel-Lock: sha1:bMjJgsIoj9c9SA+nokzETDGnPAA= Bytes: 2367 aotto1968 wrote: > Regardless of "broken code", TCL itself has some cruelties in its > syntax. Here, for example, the storage of an "array" with a > namespace path, which in TCL always has !! TWO !! commands. ONE > command to generate the namespace and ONE command to finally generate > the array. > > namespace eval ::funcDEF::MkErrN {} > array set ::funcDEF::MkErrN::my { > RETURN_MAPPING {} > ... > } This is Tcl. If something is that bothersome, just morph the language to be the way you want it to work. I.e.: proc ns-array-set {fullvarname contents} { namespace eval [namespace qualifiers $fullvarname] {} array set $fullvarname $contents } Create that once, then use it, instead of plain "array set" whenever you want to create a namespace, and then set an array within, i.e.: % ns-array-set abc::pdq::xyz [list a 1 b 2 c 3] Which has now, in a single command, created the parent namespaces, and the array variable therein: % info exists abc::pdq::xyz 1 % parray abc::pdq::xyz abc::pdq::xyz(a) = 1 abc::pdq::xyz(b) = 2 abc::pdq::xyz(c) = 3 % And, given that the 'array' command is itself a namespace ensemble, you could extend the 'array' ensemble to add a "ns-set" (or whatever name you like) to the ensemble that performs the above "create ns - and init" of a namespace variable, then you could do "array ns-set [list a 1 b 2]" in your code to replace the two commands.