[HN Gopher] Adding keyword parameters to Tcl procs
       ___________________________________________________________________
        
       Adding keyword parameters to Tcl procs
        
       Author : BoingBoomTschak
       Score  : 39 points
       Date   : 2025-04-21 16:55 UTC (6 hours ago)
        
 (HTM) web link (world-playground-deceit.net)
 (TXT) w3m dump (world-playground-deceit.net)
        
       | andrewshadura wrote:
       | Tcl is the shell done right. Simple, logical, consistent.
        
         | BoingBoomTschak wrote:
         | Well, it's certainly much better, especially now that we have
         | dicts to replace arrays. But the specter of https://wiki.tcl-
         | lang.org/page/exec+ampersand+problem (cf https://core.tcl-
         | lang.org/tips/doc/trunk/tip/424.md) still looms.
        
         | grewsome wrote:
         | Tcl does appear to be a command language done right, I don't
         | think there is a better one. As it was designed after bash etc,
         | I guess the Tcl developers could see the inconsistencies there,
         | which helped them do Tcl right.
        
         | IshKebab wrote:
         | Well... Yes and no. It's definitely better than most shells,
         | but that's a very low bar. It's pretty awful compared to any
         | "real" programming language, which is a problem because it's
         | used in places where a real programming language would be much
         | more appropriate.
        
       | tracnar wrote:
       | I implemented something very similar a while ago, it's indeed too
       | bad it's not built-in. I don't think you need such a "quasiquote"
       | function, [list {*}$args] can escape a single command, and then
       | it's a matter of joining multiple commands using a newline. IIRC
       | that's how I did it.
       | 
       | I also had further fun with wrapping "proc" by implementing a
       | "pyproc" which called out to Python while looking like a normal
       | Tcl proc.
        
         | BoingBoomTschak wrote:
         | The problem is mainly the square brackets that force one to go
         | through strings, in my experience. Can't build something like
         | "set foo [cmd $bar]" purely by using [list ...] shenanigans,
         | since list will quote stuff you don't want quoted.
        
           | tracnar wrote:
           | True, I believe I mostly worked around that limitation by
           | splitting off quoted from unquoted code into separate
           | commands. So in your example "[cmd $bar]" would be in a
           | separate unquoted command, probably putting it in a temporary
           | variable, which can cause problems as it's hard to have a
           | private scope when doing metaprogramming. You can also use
           | "[list]" in the middle of code, but it gets more error prone,
           | for example "set foo \\[[list cmd \$bar]\\]"
           | 
           | For sure there is a lack of proper "code as data" constructs
           | in Tcl, like you would find in Lisp.
        
             | BoingBoomTschak wrote:
             | Actually, you can see the "backslash hell" version here if
             | you want to estimate the clarity gains:
             | https://git.sr.ht/~q3cpma/tcl-
             | misc/tree/f613898c3dcfa3ca958a...
        
       | blacksqr wrote:
       | The OpenACS web server toolkit has a lot of useful Tcl utilities,
       | including the ad_proc procedure, which wraps proc and allows
       | adding of switches, inline docs, and more.
       | 
       | I think it would be very useful to turn ad_proc into a built-in
       | command and incorporate it into TCL.
       | 
       | https://nstcl.sourceforge.net/docs/nstcl-core/ad_proc.html
        
         | shawn_w wrote:
         | Personally I'm a fan of TEPAM from tcllib, which does much the
         | same (and tcllib is available through many OS's package
         | managers making it more readily available)
         | 
         | https://core.tcl-lang.org/tcllib/doc/trunk/embedded/md/tclli...
        
         | grewsome wrote:
         | For incorporating into Tcl I'd prefer something simpler that
         | would also work with existing procs. Building on {*}, maybe {@}
         | could work (to skip over arguments to a specified argument}.
         | e.g. when calling a function: someFunc someVal anotherVal
         | {@}someArgName yetAnotherVal
        
       | jrapdx3 wrote:
       | As a search of the Tcl wiki shows, attempts to add named-argument
       | capability to the Tcl _proc_ command have been around for several
       | years.
       | 
       | My own _nxproc_ extension is more comprehensive. (See wiki [0].)
       | 
       | The extension enables named arguments, regular positional
       | arguments, and 'rest' arguments, _nxargs_ and _nxunknown_.
       | _Nxproc_ also provides (optional) type-checking of procedure
       | arguments. (Types: string, number, bool and enumerated. Enums are
       | lists of values restricting what the arg can contain.)
       | 
       |  _Nxproc_ supports TclOO with _nxcontructor_ and _nxmethod_
       | commands -- same feature set as  "plain" _nxproc_. Also provides
       | case-insensitive  '-ci' variants, and runtime display of named-
       | argument default/actual values and types.
       | 
       |  _Nxproc_ is a Tcl C extension. Bundle has Windows, Linux
       | binaries. Compiles easily on other platforms.
       | 
       | [0] https://wiki.tcl-lang.org/page/nxproc
        
       | RicoElectrico wrote:
       | Synopsys tools (either CosmosScope or Custom Wave view) do it by
       | the way of names following values. Like:
       | measureFoo $signal threshold 0.9 edge last
        
       ___________________________________________________________________
       (page generated 2025-04-21 23:00 UTC)