On Feb 18, 2013, at 8:02 PM, Lawrence Velázquez <[email protected]> wrote:

> I don't think return is behaving like you (or I) expect.

The following is somewhat academic, but some might find it instructive. And it 
will almost certainly make Jeremy hate Tcl more than he already does.

The Tcl "return" command[1] takes the form

    return [option value]* [result]?

- If you use "return", the proc just returns an empty string.
- If you use "return a", the proc returns "a". This is the common case.
- If you use "return a b", the proc again returns an empty string. It also 
produces a dictionary containing the key/value pair "a : b"; this dictionary 
can be captured by a "catch" command.
- If you use "return a b c", the proc returns "c" and produces the same 
dictionary as before.
- If you use "return a b c d", the proc returns an empty string and produces 
the dictionary "a : b, c : d".
- Ad nauseam. Some options, like "-code", are treated specially by Tcl.

Also note that Tcl does not evaluate expressions unless explicitly asked to. 
The "if", "while", and "for" commands evaluate their conditionals (but not 
their bodies); there may be other examples. Otherwise, you're on your own. (NB: 
Expression evaluation is distinct from variable and command substitution.)

Now we see what compiler_is_port actually does.

> proc portconfigure::compiler_is_port {compiler} {
>     return [portconfigure::compiler_port_name ${compiler}] != ""
> }

The compiler_port_name command is substituted, and its return value becomes a 
key in the results dictionary with the associated value "!=". The proc *always* 
returns the empty string. Similar issues would have come up with 
arch_flag_supported.

The boolean expressions must be explicitly evaluated with "expr"; I committed 
this in r103219.

Whoo, Tcl!

vq

    [1] http://www.tcl.tk/man/tcl8.5/TclCmd/return.htm
_______________________________________________
macports-dev mailing list
[email protected]
https://lists.macosforge.org/mailman/listinfo/macports-dev

Reply via email to