Vlákno názorů k článku TCL základy (1) od Robert-Antonio - {skakal pes pres oves} Jak interpreter pozná, zdali jde...

  • Článek je starý, nové názory již nelze přidávat.
  • 23. 9. 2004 15:15

    Robert-Antonio (neregistrovaný)

    {skakal pes pres oves}
    Jak interpreter pozná, zdali jde o řetězec, v němž se nerozvinují $-sekvence, anebo o seznam o čtyř členech?
    Nebo pro Tcl je řetězec a seznam jedno a totéž?

  • 23. 9. 2004 17:14

    JaR (neregistrovaný)

    Ano, retezec je v zasade totozny se seznamem, je to podobne jako treba s rozlozenim radky v awk ($0 cely radek, tady je cely radek proste ta promenna; $1 je prvni polozka pred oddelovacem - bezne whitespacem - a tady je to [lindex $x 0], cislovani polozek je od 0).
    Podle definice: A list is simply a string with list elements separated by white space.
    Uvedeny retezec je tedy i seznamem o ctyrech clenech. Ale pozor. Slozene zavorky ztraci svuj specialni vyznam v uvozovkach:

    % set x {a b}
    a b
    % puts $x
    a b
    % set r {$x g}
    $x g
    % puts $r
    $x g
    ## ale pozor !
    % set z "e {$x} f"
    e {a b} f
    % puts $z
    e {a b} f


    Co se jeste seznamu seznamu tyka, tak z clanku mozna nemusi byt nekomu jasne, proc se list v prikladu inicializuje prikazem list a ne proste zavorkama, tedy:

    % set novySeznam [list 1 dva 3]

    a ne

    % set novySeznam {1 dva 3}

    Takto je to ekvivalentni, ale rozdil bude az budete potrebovat ruzne expandovat ci neexpandovat promenne pri tvorbe listu. Ve slozenych zavorkach se neexpanduje nic, v uvozovkach vse. Takze prikaz list je cesta, jak udelat mix obojiho :-). Tedy treba:

    % set y [list {$x} $x]
    {$x} {a b {c d} {e f}}
    % puts [lindex $y 1]
    a b {c d} {e f}
    % puts [lindex $y 0]
    $x

    ale

    % set y "{$x} $x"
    {a b {c d} {e f}} a b {c d} {e f}
    % set y {{$x} $x}
    {$x} $x
    % set y {"$x" $x}
    "$x" $x


    Tcl je bezva jazyk na rychle sflikovani nejakeho skriptu s GUI, ale tyhle cary s expandovanim a neexpandovanim aby prase zvalelo... Nicmene jak si zvyknete, tak uz budete asi v pohode :-).