[Richard Suchenwirth] - When coding for [Graph theory in Tcl], I noticed I had to translate mathematical formulations from the book to procedural Tcl code. Routine, yes, but on second look I thought it could be nice to add some sugar (see [Salt and sugar]) to typical situations: for instance, returning a truth value can be done with a call to [expr]: ====== proc isPositive x {expr {$x>0}} ====== but as this is the required condition, one could use ''requires'' as alias for expr, so it could look like this: ====== proc isPositive x {requires {$x>0}} ====== More typing, but somehow reads nicer... And once started with that, I wanted to factor out testing loops like in ''isEulerian'', which break and return false when the test fails once, or return true after looping over all cases, so I could write: ====== proc arePositive list {requires all i in $list {isPositive $i}} ====== Pretty neat for Tcl, huh? And in place for "all", you could place other logical quantifiers like "any, none"... well, just see for yourself: ====== proc requires {what args} { if ![llength $args] { uplevel 1 expr $what } else { foreach {_var "in" list body} $args break switch -- $what { each - all {set fail 0; set not !} one - any {set fail 1; set not ""} no - none {set fail 0; set not ""} default {error "usage: requires Q Var in List Body"} } upvar 1 $_var var foreach var $list { if $not[uplevel 1 $body] {return $fail} } expr !$fail } } ====== # Here are usage examples for the single and set form, and test code: ====== proc isEven x {requires {$x%2 == 0}} proc isOdd x {requires ![isEven $x] } proc areEven list {requires all i in $list {isEven $i}} proc hasEven list {requires any i in $list {isEven $i}} proc areEven2 list {requires no i in $list {isOdd $i}} foreach test { {isEven 2} {isEven 4711} {areEven {2 4 6}} {areEven {2 4 5}} {areEven {}} {hasEven {1 3 5}} {hasEven {1 4 5}} {hasEven {}} {areEven2 {2 4 6}} {areEven2 {2 4 5}} {areEven2 {}} } { puts "$test:[eval $test]" } # The behavior on empty lists leaves something to be wished, though... ====== '''Sugared assignment:''' this version evolved in the [Tcl chatroom]: ====== proc let {varName "=" args} { upvar 1 $varName v set v [uplevel 1 expr $args] } ;# dkf ====== See also [Let's assign with Let] ---- ---- *** Appendix Section*** ---- [gold] 10/11/2020. Added appendix below, but original source code and text above was unchanged. ---- *** References *** ---- * [expr] * [Graph theory in Tcl] * [Let's assign with Let] * [playing Haskell] * [steps towards functional programming] * [I love foreach] * [foreach] * [functional composition] * [Richard Suchenwirth] * [functional programming] * [Lambda in Tcl] * [upvar sugar] * [Salt and Sugar] * [Math sugar] * [A little math language] * [args] * Richard Suchenwirth [RS] * [LV] * [Radical Language Modification] * [Functional Programming] * [Custom curry] * [Playing with recursion] * [Sample Math Programs] * Professor Frisby's Mostly Adequate Guide to Functional Programming [https://github.com/MostlyAdequate/mostly-adequate-guide] * [expr shorthand for Tcl9] * [Steps towards functional programming] * [Tacit programming] * [Natural User Interface] * [Natural Languages] category * [A Program That Learns] * [Find all words] * [Things German] * [How to synthesize a query] * [Writing Tk programs so that the user can extend or interact with them without modifying the application] * [Ruslish] * [Accumulator Generators] * [Accumulator Generator] * [Whadjasay] * disassemble TCL byte code [https://www.magicsplat.com/blog/disassemble/] * [Call Procedure Like Fortran Example] ---- **Hidden Comments Section** ---- <> Please place any comments here, Thanks. <> Numerical Analysis | Toys | Calculator | Mathematics| Example| Toys and Games | Games | Application ---- <> Development | Concept| Algorithm | AI | Natural Language ---- <> Arts and crafts of Tcl-Tk programming | Category Functional Programming ----