Groups | Search | Server Info | Login | Register


Groups > comp.lang.tcl > #55707

question about array traces

From Petro Kazmirchuk <vivid.tree7955@fastmail.com>
Newsgroups comp.lang.tcl
Subject question about array traces
Date 2026-05-09 22:10 +0200
Organization A noiseless patient Spider
Message-ID <10to4bp$3t1ot$1@dont-email.me> (permalink)

Show all headers | View raw


TLDR: it seems to me that "trace add variable my_array {array ...} 
cmdPrefix" has rather limited use compared to {read write unset}, so 
I'll really appreciate any real world docs/examples on how and when I am 
supposed to use it (or Tcl_TraceVar+TCL_TRACE_ARRAY in C).

Background: I have a Tcl 8.6/C++ app that exposes a tree-like C++ 
structure as a Tcl array: $my_array(key/subkey/subkey)
Users can:
- read a value using a key
- write a value using a key
- delete a value with [unset]
- use [array names]/get/set with a glob-pattern/* to query a subset of 
this structure

This is implemented only in C++ with Tcl_TraceVar.
Although back then (years ago) the array-like API seemed simple and 
convenient, now I can see its limitations and rather complex C++ code, 
so I'm trying to refactor it by:
- moving as much logic as possible from C++ to Tcl
- making C++ a thin layer that returns an opaque handle to the structure 
and implements a set of functions to work with it
- making a proper Tcl ensemble for full access to the functionality
- on top of this ensemble I'm reimplementing the "traced Tcl array" API 
for backwards compatibility with 1000s LoC that my users have written 
over years. So, I've moved from Tcl_TraceVar to "trace add variable 
array_name {array read write unset}"

I'm done with the read/write/unset part, this was straightforward. In 
many cases users know keys in advance, and then it's enough. But often 
they need to discover keys dynamically using [array names] etc, and for 
this I must use the "array" ops, which after some thinking and looking 
around does seem like an afterthought with serious limitations. When 
this trace is invoked:

1. I don't know which subcommand caused it (names/get/set/size?)
2. I don't know what the glob pattern was
3. so, it forces me to populate the whole array with keys *and* values, 
which might be expensive, even if a user is asking smth like [array 
names key/subkey*] which will eventually return only a small subset of keys.
4. Finally, I have no way to distinguish [info exists my_array(key)] 
from a normal read trace.

I guess, I can work around these limitations with [dict get [info frame 
-2] cmd], but this looks like an awful hack, and I'm not sure how 
reliable it is.

So, before I dig deeper, I'm looking around for real-world examples of 
how it was supposed to be used *properly*, and what pitfalls I might 
encounter.
BTW I did check the Ashok's book, and it doesn't go into much detail in 
this aspect either (understandably so, it's very thick already)

thanks in advance!
Petro

Back to comp.lang.tcl | Previous | Next | Find similar


Thread

question about array traces Petro Kazmirchuk <vivid.tree7955@fastmail.com> - 2026-05-09 22:10 +0200

csiph-web