Version 1 of Things British

Updated 2001-10-26 15:34:20

Richard Suchenwirth - This is not another OO game, just some Tcl notes for peculiarities of the United Kingdom. Tcl/Tk code to draw the Union Jack on a canvas can be had at Describing and rendering flags in Tcl.

Non-decimal money: Kevin Kenny (2 November 2000) At least we seldom have to deal with mixed radix currencies any more; dealing with pounds-shillings-pence was quite an �sd trip.

 �2 16s 2 3/4d

was read as "two pounds, sixteen shillings tuppence ha'penny farthing").

RS: Except for fractions of old pence, the following converts decimal GBP amounts to L-s-d, and Unicoded:

 proc dec2trad {amount {slash " "}} {
        set L [expr int($amount)]
        set s [expr int(($amount-$L)*20)]
        set d [expr int(($amount-$L-$s/20.)*240+0.5)]
        set res ""
        if {$slash==" "} {
                if $L {append res "\u20A4$L"}
                if $s {append res " ${s}s"}
                if $d {append res " ${d}d"}
        } else {
                if $L {append res "\u20A4$L/"}
                if $s {append res $s} else {append res -}
                if $d {append res /$d} else {append res /-}
        set res
 dec2trad 10.01 /
 dec2trad .10 /

UK phone-book sorting order: Donal Fellows wrote in comp.lang.tcl: Indeed, even for strings there are many different ordering relations. Tcl supports two directly in [lsort]: ASCII and Dictionary. There are others though; dictionary ordering should be dependent on locale, and there are also other orderings like phone-book ordering (in the UK, MacDonald should come between McArthur and McEwan in phone number listings, and all should precede Mabbs.)

 proc {x y} {
        foreach i {x y} {
            regsub {Ma?c ?([A-Z])} [set  $i] {M_\1} $i
        string compare $x $y
 lsort -command {MacDonald McArthur McEwan Lyttle Mabbs Jones}
 Jones Lyttle McArthur MacDonald McEwan Mabbs

KBK (14 February 2001) -- [lsort -command] is a pig from the performance standpoint. Much faster, although treble the memory consumption, is:

 proc { list } {
    foreach name $list {
        regsub {Ma?c ?([A-Z])} $name {M_\1} key
        lappend list2 [list $key $name]
    foreach pair [lsort -index 0 -ascii $list2] {
        lappend list3 [lindex $pair 1]
    return $list3
 } {MacDonald McArthur McEwan Lyttle Mabbs Jones}

For virtually all applications, this technique of ``sort a list of pairs'' should be preferred to [lsort -command].

There's a benchmark of the two versions of the command over on the lsort page.

Arts and crafts of Tcl-Tk programming