From: Lars H. <Lar...@re...> - 2009-07-08 12:54:46
|
Joachim Kock skrev: > On 06/07/09 14:17, Richard M. wrote: >> In AlphaX 8.2b13, trying Electrics menu -> Standard templates -> >> createHeader >> yields: >> >> [docProj::topHeader] error! >> can't read "info(ctime)": no such variable > > Hello Richard, > > thanks for catching this. I have looked into this, and it > seems it involves some very strange bugs. I don't expect > you to have any interest in the remaining explanations, > really addressed at the developers list. > [snip] > > In summary there are two strange bugs: > > 1: file stat only works as expected if the variable is > fully qualified This is because our [file] is a proc wrapper around the real thing. [info body file] returns: if {[lindex $args 0] eq "normalize"} { set result [::__file {*}$args] return [unicodeNormalize FormC $result] } else { return [::__file {*}$args] } The calls to [__file] (Tcl core command) should really be [uplevel]ed, so that subcommands like [file stat] can access local variables from the calling context, rather than the context of the [file] proc. In other words, [file stat "/path/to/some/existing/file" AA] really filled in the AA array, although it was the AA array in [file]... A nicer way to fix this could however be to turn [file] into a an ensemble, and do the patching at that level. (I wouldn't be surprised if [file] becomes an ensemble in Tcl 8.6.0 -- [info], [string], and [clock] already are -- but at least in 8.6b1 it's still a simple command.) In that case, the patching can be done as follows: rename file __file proc file_normalize {name} { unicodeNormalize FormC [__file normalize $name] } namespace ensemble create -command ::file -map { normalize ::file_normalize } -unknown {::apply {{file subcmd args} {list ::__file $subcmd} ::}} Explanation: 1. As usual, the core [file] is renamed [__file]. 2. A proc [file_normalize] is created to perform the patched [file normalize] operation. 3. An ensemble [file] is created. This maps the subcommand "normalize" to the [file_normalize] command. No other subcommands are defined, so everything else is passed on to the -unknown handler, which translates any [file] call to the corresponding [__file] call. Lars Hellström |