2014-11-24 5 views
0

В TCL существует элегантная реализация, которая будет имитировать `ifdef, часто используемую в языках программирования. Из самого языка сценариев TCL я не смог найти способ, который поддерживается TLS-интерпретатором.эквивалент ifdef в TCL

+0

Нет, что вы пытаетесь сделать? – Kevin

+0

На основе конкретного проекта мне, возможно, придется изменить команды на инструмент, который поддерживает язык TCL в дизайне чипов. Например, 'ifdef PROJ_FOO set_lib x' else set_lib y 'endif - это намерение – Mike

+0

http://www.gnu.org/software/m4/ – Kevin

ответ

5

В Tcl нет ничего, что эквивалентно «ifdef», за исключением стандартного оператора «if». Если вам не нравится стандартный оператор «if», tcl дает вам все основные строительные блоки для создания вашей собственной команды «ifdef».

Например, ifdef действительно не более чем оператор if, ищущий определенное значение. Действительно простая реализация может выглядеть примерно так:

proc define {name value} { 
    set ::defined($name) $value 
} 

proc ifdef {name script1 else script2} { 
    if {[info exists ::defined($name)]} { 
     uplevel $script1 
    } else { 
     uplevel $script2 
    } 
} 

Вы могли бы использовать его как это:

define FOO 1 
... 
ifdef FOO { 
    <do this if FOO is defined> 
} else { 
    <do this if FOO is NOT defined> 
} 
+0

Любой указатель на то, как я могу создать свою собственную команду ifdef. – Mike

+0

@Mike: Я обновил свой ответ на примере. Мои навыки tcl довольно ржавые, но это, похоже, работает. Для более готовой к исполнению продукции вам может потребоваться больше пуленепробиваемости и сделать блок else необязательным, но я надеюсь, что это дает представление. –

+0

Большое спасибо. Это slic solution – Mike

4

Если вы пытаетесь проверить переменную Evironment, вы можете сделать что-то вроде:

if {[info exists ::env(PROJ_FOO)]} { 
    set_lib x 
} else { 
    set_lib y 
} 

Если у вас есть некоторые команды Tcl называется set_lib.

+0

set_lib - это специальная команда. Похоже, что единственный способ сделать это - установить переменную ENV, как в языках программирования SHELL. Я думал, есть ли какой-либо вариант командной строки для выборочного запуска кода. tcl -f foo.tcl -define PROJ_FOO (избегает установки переменной ENV) – Mike

0

Посмотрите на [Информация существует VarName] и подобные. Например:

если {[Информация существует MYVAR]!} {Путы «MYVAR не определены так определить его здесь»}

Побольше типизации, но очевидно, что происходит и может быть использовано для чего информации может проверить.

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