Strano TCL capriccio
-
30-09-2019 - |
Domanda
Sono molto nuovo e inesperto per le vie della programmazione TCL. Ho scritto uno script che chiama un proc scritto da qualcun altro, prima di rimuovere il file di output. E poi fa un po 'di logica addizionale che ho scritto.
I spostato la logica in una seconda proc e immediatamente un mazzo di esso rotto (ossia i comandi rm).
Da quello che posso dire, il primo programma su una linea interna l'esecuzione centrale (il testo seguente definizioni proc) esegue normalmente senza un comando "exec". Tuttavia, se lo si sposta all'interno di un proc, ora ha bisogno di un comando "exec".
Qualcuno può spiegarmi perché TCL comporta in questo modo?
per es.
proc helloworld {} {
puts "hi"
}
#works
rm my_file
helloworld
..
proc helloworld {} {
#doesn't work
rm my_file
puts "hi"
}
helloworld
..
proc helloworld {} {
#works
eval rm my_file
puts "hi"
}
helloworld
..
proc helloworld {} {
#works
file delete my_file
puts "hi"
}
helloworld
* Nota: questo strano comportamento può essere specifico per il programma che sto alimentando lo script per VMD, che ha il suo costruito nel comportamento TCL. Forse nelle vostre risposte è possibile indicare se questo è normale per gli altri interpreti come bene?
Soluzione
Un interattivo tclsh sessione cercheranno di exec
un comando sconosciuto (come rm
). Non si può contare su questo comportamento in esecuzione di script non interattivo o, come hai scoperto, in proc.
Non riesco a vedere che questo è documentato nella tclsh pagina man, ma il sconosciuto href="http://www.tcl.tk/man/tcl8.5/TclCmd/unknown.htm" rel="nofollow"> fa. Si veda anche la href="http://wiki.tcl.tk/tclsh" rel="nofollow"> tclsh pagina sul wiki Tcl. In una sessione tclsh interattivo, si può vedere cosa unknown
fa digitando:
info body unknown
[update]
Citando "Programmazione Pratico in Tcl e Tk":
Il comando
unknown
fornisce poche altre comodità. Questi sono usati solo quando si digita direttamente i comandi. Essi sono disattivati ??quando l'esecuzione entra in una procedura o se la shell Tcl non viene utilizzato in modo interattivo. Le caratteristiche di convenienza sono l'esecuzione automatica di programmi, cronologia dei comandi, e il comando sigla. Queste opzioni sono tentato, in ordine, se un'implementazione comando non può essere caricato da una libreria di script.
Altri suggerimenti
Nota: questo è programatically verificabile anche, tramite la variabile tcl_interactive , che è "1" se il Tcl viene eseguito tramite una shell interattiva, e "0" in caso contrario. La variabile è inoltre configurabile, quindi si può avviare una shell interattiva, allora [set tcl_interactive 0] , e proseguire. A questo punto, si perde tali caratteristiche come