2014-02-11 3 views
1

Почему переименование set нарушает интерактивный режим Tcl?Почему переименование `set` прерывает интерактивный режим Tcl?

info script {} 
set tcl_interactive 1 
puts [st toupper foo]; # FOO 
rename set xyz 
puts [st toupper foo]; # Runtime error 

(см Ideone.com demo.)

Этот вопрос чисто абстрактно-я заметил это странное поведение, однако код-гольф и хотел понять внутренности немного лучше.


Er, то же самое происходит, когда я переименовать regsub, но не join или split.

ответ

3

Когда Tcl находится в интерактивном режиме, он хранит команды, которые вы вводите в историю. Это выполняется командой history, причем записи помещаются в историю с помощью подкоманды history add. (Осталось еще несколько вещей: по умолчанию используется обработчик команд по умолчанию unknown, чтобы получить такие вещи, как предыдущая запись истории, но они касаются только вашего вопроса.)

Команда history написана на Tcl. Это implementation, по-видимому, использует set (помимо всего прочего) внутри реализации подкоманды history add, но не join или split. Команда unknownтакже условно написанная в Tcl (у меня нет такой приятной ссылки, она похожа на init.tcl). Он использует больше команд, включая regsub (но только в сложном анализе истории).

В целом, некоторые части Tcl написаны в Tcl, потому что писать все в C будет сосать для поддержания. Если вы неправильно переписываете или удаляете части Tcl, все сломается. Вы можете сломать их, если хотите, но тогда вы можете держать куски. (Если вы заменяете стандартную команду и ожидаете, что будете по-прежнему запускать стандартные скрипты, вам лучше будет дублировать ее функциональность с оригинальным именем, или произойдет поломка. Caveat scriptor.)

+0

Проблема здесь не 'history', это' unknown'. Неизвестные вызовы 'set' (не существует) -> вызывает' unknown'. –

+1

@JohannesKuhn Но 'history' также вызывает' set', и каждая команда, введенная в интерактивном режиме, проходит через 'Tcl_RecordAndEval', который в наши дни просто выполняет вызов' history add'. После этого цикл в 'unknown' ... –

Смежные вопросы