[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)