Posted to tcl by dbohdan at Thu Sep 12 17:06:53 GMT 2019view pretty

#! /usr/bin/env tclsh
# https://wiki.tcl-lang.org/page/Sparkline, one-$ version

proc $ var-name {
    upvar 1 ${var-name} var
    return $var
}

namespace eval sparklines {
        namespace export create

        variable version 0.0.5
        variable ticks [list  ‚ ƒ „ … † ‡ ˆ]
        variable tick-max [expr {
            [llength [$ ticks]] - 1
        }]

        proc create data {
                variable ticks
                variable tick-max

                set sorted [lsort -real [$ data]]
                set min [lindex [$ sorted] 0]
                set max [lindex [$ sorted] end]

                if {[$ min] == [$ max]} {
                    # All data points are the same.
                    return [string repeat \
                            [lindex [$ ticks] [expr {int([$ tick-max] / 2)}]] \
                            [llength [$ data]]]
                } else {
                    set result {}
                    foreach x [$ data] {
                        set x-normalized [expr {
                            int([$ tick-max] * ([$ x] - [$ min]) / 
                                               ([$ max] - [$ min]))
                        }]
                        append result [lindex [$ ticks] [$ x-normalized]]
                    }
                    return [$ result]
                }
        }
}

# The following code allows you to use this script from the command line much
# like the Bash version mentioned above.
proc main-script? {} {
    # From https://wiki.tcl-lang.org/40097.
    global argv0

    if {[info exists argv0]
        && [file exists [info script]]
        && [file exists [$ argv0]]} {
        
        file stat [$ argv0] argv0-info-arr
        file stat [info script] script-info-arr

        set argv0-info [array get argv0-info-arr]
        set script-info [array get script-info-arr]

        expr {
            [dict get [$ argv0-info] dev] == [dict get [$ script-info] dev]
            && [dict get [$ argv0-info] ino] == [dict get [$ script-info] ino]
        }
    } else {
        return 0
    }
}

if {[main-script?]} {
    if {[$ argv] eq ""} {
        puts "usage: [$ argv0] value ?value...?"
        puts "       [$ argv0] \"value ?value...?\""
    } elseif {[$ argv] eq "test"} {
        proc assert {v1 v2} {
            if {[$ v1] eq [$ v2]} {
                puts [$ v1]
            } else {
                error "assertion failed: \"[$ v1]\" ne \"[$ v2]\""
            }
        }

        assert [sparklines::create {1 5 22 13 53}] {ƒ‚ˆ}
        assert [sparklines::create {0 30 55 80 33 150}] {‚ƒ„‚ˆ}
        assert [sparklines::create {9 13 5 17 1}] {„†‚ˆ}
        assert [sparklines::create {1 1 1 1}] {„„„„}

        puts ok
    } else {
        if {[llength [$ argv]] == 1} {
            set argv [lindex [$ argv] 0]
        }

        puts [sparklines::create [$ argv]]
    }
}

Comments

Posted by avl at Tue Sep 17 07:09:39 GMT 2019 [text] [code]

interp alias {} $ {} set