proc math {expr} { set value "" set statements [split $expr ";\n"] foreach statement $statements { set statement [string trim $statement] if {$statement eq ""} continue set n [regexp {^(\S+)\s*=\s*(.*)} $statement . var m] if {! $n} { error "cannot parse $statement" } set value [uplevel 1 set $var \[expr \{$m\}\]] # puts "DEBUG: set $var \[expr \{$m\}\] <== $value" } return $value } # Sample usages # Pythagoras lassign {0 0 3 4} x0 y0 x1 y1 math { dx = ($x1 - $x0); dy = ($y1 - $y0); len = hypot($dx, $dy) } puts "dx: $dx dy: $dy len: $len" # Example from the tip-282 page lassign {3 4} y z math { x = 5 * $y + 6 * $z; w = $x**2 + $y**2; v = $w**2 + $y**2; } # Parsing timestamps set totalSeconds [expr {11 + 12*60 + 13*60*60 + 14*60*60*24}] math { seconds = $totalSeconds % 60; totalMinutes = $totalSeconds / 60; minutes = $totalMinutes % 60; totalHours = $totalMinutes / 60; hours = $totalHours % 24; days = $totalHours / 24; } puts "days: $days hours: $hours minutes: $minutes seconds: $seconds"
[aplsimple] - 2018-09-28 13:45:18It was passed over modestly:)) but there are another smart features of your code:
- expressions may be divided with "\n" - ";" is superfluous at the end of line - expressions piled into a line are divided with ";" - spaces may be omitted everywheree.g.
% set totalSeconds [expr {11 + 12*60 + 13*60*60 + 14*60*60*24}] ==> 1257131 % math { seconds = $totalSeconds % 60 totalMinutes = $totalSeconds / 60; minutes = $totalMinutes % 60 totalHours=$totalMinutes/60;hours=$totalHours%24 days = $totalHours / 24 } ==> 14 % puts "days: $days hours: $hours minutes: $minutes seconds: $seconds" ==> days: 14 hours: 13 minutes: 12 seconds: 11