On Thursday 06 March 2008 06:22:21 Will Coleda wrote:
> in PDD17, the following program (which prints "b\n" in trunk), dies:
>
> $ ../../parrot tcl.pbc -e "puts [concat {expand}[lindex {a b} 1]]"
> argument doesn't array.
Ha. The problem's not Parrot (as far as I can tell) but Tcl. {a b} is a
two-element list, right?
Take t/cmd_expr.t, which sets a variable named TODO:
set TODO {TODO "correct precision"}
# math functions, happy path
is [expr abs(-1)] 1
is [expr abs(1)] 1
is [expr abs(1.0)] 1.0
is [expr abs(-1.0)] 1.0
is [expr acos(0)] 1.5707963267948966 {} $TODO
is [expr asin(1)] 1.5707963267948966 {} $TODO
The acos() and asin() tests cause an abort in Parrot, with the "argument
doesn't array" message. This makes sense; is() expects that the fourth
argument is a two-element list:
proc is {value expected {description ""} {special {}}} {
However, if you dump this code to PIR, you'll see:
$P102 = new 'TclString'
assign $P102, "TODO"
$P103 = new 'TclString'
assign $P103, "TODO \"correct precision\""
if epoch != 0 goto dynamic_109
.local pmc a_varName_108
a_varName_108 = $P102
.local pmc a_newValue_108
a_newValue_108 = $P103
.local pmc temp
if null a_newValue_108 goto read_var_108
.local pmc set_108
set_108 = get_root_global ['_tcl'], '__set'
$P104 = set_108(a_varName_108, a_newValue_108)
... which indicates to me that TODO gets stored as a string, not a list.
-- c