2017-07-10 1 views

Répondre

0

en général, vous n'avez pas parce que vous ne pouvez pas en général dire si row row row your boat est une chaîne ou une liste de cinq éléments . (Tcl possède des informations de type interne, mais ce n'est pas aussi utile que vous l'espérez.) Mais si vous connaissez les feuilles de votre structure de liste imbriquée sont tous des nombres (ou toute autre chose qui fonctionne comme un simple mot), vous peut le faire.

proc printGuessListStructure {theList {indices {}}} { 
    if {$theList eq [lindex $theList 0]} { 
     puts "element $theList is at $indices" 
     return 
    } 
    set idx -1 
    foreach value $theList { 
     printGuessListStructure $value [concat $indices [incr idx]] 
    } 
} 

Test it out:

set mylist {1 2 {34 45 {567 678}}} 
printGuessListStructure $mylist 

imprime ceci:

 
element 1 is at 0 
element 2 is at 1 
element 34 is at 2 0 
element 45 is at 2 1 
element 567 is at 2 2 0 
element 678 is at 2 2 1 

La clé est que le test $theList eq [lindex $theList 0] est quelque chose qui tient des mots simples, et nous permet de éviter de récurer éternellement dans le cas où une feuille ressemble à une liste à un élément. En outre, la raison pour laquelle l'examen des types internes de Tcl n'est pas utile est que les valeurs n'ont pas de type fixe et que Tcl est assez agressif en interne à propos de la fusion constante. Les choses que vous pensez être une liste peuvent être quelque chose d'autre temporairement quand vous le regardez. Se concentrer sur ce que vous voulez dire sans types évite mieux la confusion!