how to create a simple closure to create validators

Liste des GroupesRevenir à cl tcl 
Sujet : how to create a simple closure to create validators
De : mark (at) *nospam* qtrac.eu (Mark Summerfield)
Groupes : comp.lang.tcl
Date : 20. Jun 2024, 08:59:24
Autres entêtes
Message-ID : <sMicnWfm8djBfO77nZ2dnZfqnPWdnZ2d@brightview.co.uk>
User-Agent : Pan/0.154 (Izium; 517acf4)
I can make a variable that has a specific validator quite easily using
trace add.

But I can't work out how to create a validator maker (i.e., a simple
closure).

I am using Tcl/Tk 9.0b2.

Here is the code:

#!/usr/bin/env tclsh9

proc valid_percent {varname elemname op} {
    upvar 1 $varname var
    if {$op eq "write"} {
        if {$var < 0} {
            set var 0
        } elseif {$var > 100} {
            set var 100
        }
    }
}

proc check {expected actual} {
    if {$expected != $actual} {
        puts "ERROR $expected != $actual"
    } else {
        puts "OK $expected == $actual"
    }
}

trace add variable percent write valid_percent

set percent 50
check 50 $percent
set percent -5
check 0 $percent
set percent 492
check 100 $percent

# All the above works correctly; what's below fails with:
#   can't read "min": no such variable

proc clamper {min max} {
    proc clamp {varname elemname op} {
        upvar 1 $varname var
        if {$op eq "write"} {
            if {$var < $min} {
                set var $min
            } elseif {$var > $max} {
                set var $max
            }
        }
    }
    return clamp
}

trace add variable score write [clamper 0 20]

set score 15
check 15 $score
set score -5
check 0 $score
set score 25
check 20 $score

Date Sujet#  Auteur
20 Jun 24 * how to create a simple closure to create validators4Mark Summerfield
20 Jun 24 +* Re: how to create a simple closure to create validators2et99
21 Jun 24 i`- Re: how to create a simple closure to create validators1Mark Summerfield
20 Jun 24 `- Re: how to create a simple closure to create validators1Joerg Mertens

Haut de la page

Les messages affichés proviennent d'usenet.

NewsPortal