Странная причуда TCL - PullRequest
       26

Странная причуда TCL

1 голос
/ 14 октября 2010

Итак, я очень новичок и неопытен в способах программирования TCL. Я написал скрипт, который вызывает proc, написанный кем-то другим, сначала удаляя выходной файл. Затем он выполняет некоторую дополнительную логику, которую я написал.

Я переместил логику во второй процесс, и сразу же он сломался (а именно команды rm).

Из того, что я могу сказать, первая программа в строке внутри центрального исполнения (текст, следующий за определениями proc) обычно выполняется без команды "exec". Однако, если вы перемещаете его внутри proc, теперь ему нужна команда "exec".

Может кто-нибудь объяснить мне, почему TCL ведет себя так?

, например

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

* Обратите внимание, что это странное поведение может быть характерно для программы, которую я передаю сценарию в vmd, который имеет собственное встроенное поведение TCL. Возможно, в своих ответах вы можете указать, является ли это стандартом и для других переводчиков?

Ответы [ 2 ]

5 голосов
/ 14 октября 2010

В интерактивном сеансе tclsh exec будет пытаться *1003* неизвестная команда (например, rm). Вы не можете рассчитывать на это поведение при неинтерактивном выполнении скрипта или, как вы обнаружили, в процессах.

Я не вижу, что это описано на справочной странице tclsh , но справочная страница unknown делает это. Смотрите также страницу tclsh в вики Tcl. В интерактивном сеансе tclsh вы можете увидеть, что делает unknown, набрав:

info body unknown

[обновление]

Цитата из "Практического программирования на Tcl и Tk":

Команда unknown предоставляет несколько других удобств. Они используются только при вводе команд напрямую. Они отключаются, когда выполнение входит в процедуру или если оболочка Tcl не используется в интерактивном режиме. Удобные функции - это автоматическое выполнение программ, история команд и сокращение команд. Эти параметры пробуются по порядку, если реализация команды не может быть загружена из библиотеки сценариев.

2 голосов
/ 19 декабря 2010

Обратите внимание, что это также программно тестируется через переменную tcl_interactive , которая равна "1", если Tcl запускается через интерактивную оболочку, и "0", если нет.Переменная также может быть установлена, так что можно запустить интерактивную оболочку, затем [set tcl_interactive 0] и продолжить.На этом этапе можно потерять такие функции, как

% командная строка имя процесса / завершение имени команды (т. Е. Невозможно набрать [pu "xyz"] и получить эффект ввода [ставит «xyz»] , как интерактивная оболочка) автоматическое «выкладывание», чтобы внешние команды выполняли запрос (например, «rm» в этом оригинальном вопросе) и, возможно, другие ...
...