kons_font 16
load ./q3.so
## generator permutacji
#
proc wypelnijListe li {
set w {}
for {set i 0} {$i<$li} {incr i} {lappend w 0}
set w
}
fiber create 1 start
proc Inicjalizacja nr {
fiber$nr alias _puts _puts
fiber$nr alias maineval eval
fiber$nr alias wypelnijListe wypelnijListe
fiber$nr eval "set nr $nr; set run 1"
fiber$nr eval {
set liElem 3
proc start {} {
set ::bity [wypelnijListe $::liElem]
set ::wynik [wypelnijListe $::liElem]
# + dwie zmienne globalne...
permutacja 0
}
proc permutacja li {
if {$li>=$::liElem} {
maineval "set zm {$::wynik}"
fiber switchto main
set ::run; # jesli blad to koniec dzialania fibera!
return
}
for {set i 0} {$i<$::liElem} {incr i} {
if {[lindex $::bity $i]==0} {
lset ::wynik $i $li
lset ::bity $i 1
permutacja [expr {$li+1}]
lset ::bity $i 0
}
}
}
}
}
Inicjalizacja 0
fiber error
proc Restart nr {
if { [lindex [fiber error] $nr]!="" } {
fiber restart $nr
} else {
fiber$nr eval {unset ::run}; fiber switchto $nr
# + jedyny sposob zeby przerwac prace fibera !!!
fiber$nr eval {set ::run 1}; fiber restart $nr
}
}
Restart 0
# + restartowanie fiber0;
# UWAGA: (9.10.2014) nie restartowac PRZED pierwszym odczytem permutacji !!!
fiber0 eval {set ::liElem 4}
#% 4
fiber switchto 0; set zm
#% 0 2 1 3
#% 0 1 3 2
#% 0 1 2 3
# + odczytujemy kolejne permutacje...
exit