#!/usr/bin/tclsh
proc not {} {if {rand() < 0.5} {return "!"} else {return ""}}
proc bit {} {expr int(rand() * 100000 / 1000) % 2;}
proc var {} {
return [not][bit]
}
proc form depth {
if {$depth <= 0} {return [var]}
incr depth -1
if [expr rand() < 0.3] {return [var]}
if [expr rand() < 0.5] {return "[not]([form $depth]&&[form $depth])"}
return "[not]([form $depth]||[form $depth])"
}
set code("(") 0
set code("!") 1
set code("0") 2
set code("1") 3
set code("|") 4
set code("&") 5
set code(")") 6
for {set i 0} {$i < 1000} {incr i} {
set f [form 2]
set a [expr $f]
regsub -all {&&} $f {\&} f
regsub -all {\|\|} $f {|} f
set len [string length $f]
puts "name:{$f = $a} $len"
for {set c 0} {$c < $len} {incr c} {
puts -nonewline "i:$code(\"[string index $f $c]\")"
if {$c == [expr $len - 1]} {
puts " T:$a;"
} else {
puts " T:-"
}
}
}
syntax highlighted by Code2HTML, v. 0.9.1