foreach {sym cmd} {🗣 puts 🗣🚯 {puts -nonewline} 📍 {set ::💾(cp)}} \
{ interp alias {} $sym {} {*}$cmd }
proc isCmd sym {
expr {[info procs $sym] ne {}
|| [interp alias {} $sym] ne {}}
}
proc 🤔 {args} {
set expr {(.*?)😉(.+?)(?:🤬(.+?))?$}
regexp $expr $args -> cond then else
set body [list if $cond $then]
while {$else ne ""} {
if {[regexp $expr $else -> cond then else]} {
lappend body elseif $cond $then
} else {
lappend body else $else
break
}
}
uplevel $body
}
proc ⌨ args {
lassign $args {*}[switch [llength $args] {
1 { list var }
2 { list prompt var }
default { error }
}]
if {[info exists prompt]} { 🗣🚯 $prompt; flush stdout }
upvar $var x; set x [gets stdin]
}
proc 🪣 {var = args} {
upvar $var x
set x [if {[llength $args] > 1} \
{ uplevel "expr $args" } \
else { join $args }]
}
proc 🧊 {name code {start 0}} {
array unset ::💾
set i 0; foreach line [split $code "\n"] {
if {![llength $line]} continue
if {![isCmd [set fst [lindex $line 0]]]} {
set ::💾(tag,$fst) $i
set line [join [lrange $line 1 end] " "]
}
set ::💾(code,$i) $line; incr i
}
🚀 $start
}
proc 🤸 tag {
if {![string is integer $tag]} \
{ set tag [set ::💾(tag,$tag)] }
📍 $tag
}
proc 🚀 tag {
🤸 $tag
while {[info exists ::💾(code,[📍])]} {
set code [set ::💾(code,[📍])]; incr ::💾(cp)
uplevel $code
}
}
proc 🪬 {var args} {
upvar $var x
expr {[info exists x] && $x ne {} ? $x : [lindex $args end]}
}
proc 🌀 {var = from -> to {by {}} {step 1}} {
upvar $var i; upvar #0 💾 s
if { [🪬 s(🌀,$var,tag)] ne [📍] } {
foreach {k v} [list tag [📍] step $step to $to] \
{ set s(🌀,$var,$k) $v }
set i $from
}
}
proc ⤴ var {
upvar $var i
if {$i != [set ::💾(🌀,$var,to)]} {
🪣 i <- $i + [set ::💾(🌀,$var,step)]
🤸 [set ::💾(🌀,$var,tag)]
}
}
🧊 FizzBuzz {
☸ 🪣 X ← [🪬 X 0] + 1
🪣 S ← ""
🤔 $X > 42 😉 🤸 🚪
🤔 $X % 3 == 0 😉 🪣 S ← fizz
🤔 $X % 5 == 0 😉 🪣 S ← ${S}buzz
🗣 [🪬 S $X]
🤸 ☸
🚪 🗣 ✋
}
🧊 {Числа Фибоначчи} {
⌨ "FIB N: " N
🪣 X ← 1
🪣 Y ← 1
🗣 "\n\nПервые $N чисел последовательности:"
🌀 I ← 1 ↗ $N
🗣 $X
🪣 Z ← $X + $Y
🪣 Y ← $X
🪣 X ← $Z
⤴ I
}