While working out some bugs in ParTcl I came across something roughly
equivalent to the following Perl code (I'm using Perl because I
believe more people know Perl than Tcl, at least on this list):
#!/usr/bin/perl
$var = "Foo";
*alias = *var;
$alias = undef;
$alias = "Baz";
print $var, "\n";
And I'm stuck wondering how I'm supposed to implement that in PIR. Or
at least what the best way is to implement that in PIR.
Currently, ParTcl works this way:
$alias = undef
translates to
null $P1
$P2 = getinterp
$P2 = $P2["lexpad"; 1]
$P2['$alias'] = $P1
That is, we null variables when want them to appear almost as if
they'd never existed. (Almost because aliases still work.) Tcl is a
bit stricter than Perl, so any time we try to read an undefined value
we get an error. So
print $alias
translates to something like
$P0 = find_lexical '$alias'
if null $P0 goto error
"&print"($P0)
end
error:
print "Undefined variable '$alias'"
end
where the error will be given if $alias was never assigned a value or
if we assign undef to $alias (`$alias = undef`).
Normal assignment in Tcl looks like this:
$P0 = find_lexical '$alias'
assign $P0, new_value
We use `assign` to preserve any aliases (so that $foo == new_value, in
other words). However, if $alias is undefined (or `null`, in
PIR-speak), then that assignment fails with a "Null PMC access" error.
So what am I supposed to do? It appears that using `null` to mark
deleted/undefined variables won't work. But it's not clear to me that
using a Null PMC is a good idea (then we must perform `'isa` tests on
every read to see if that variable is undefined, which seems like it
would be expensive).
So what's the "correct" way to do this?
--
matt diephouse
http://matt.diephouse.com