TCL 8.3: синтаксическая ошибка в выражении "a eq b" - PullRequest
1 голос
/ 01 ноября 2010

Я должен запустить код TCL, написанный для версии 8.5, с интерпретатором версии 8.3.

У меня проблемы с eq.Кажется, 8.3 не распознает это.Простой код:

% expr { "a" eq "b" }

возвращает сообщение об ошибке вроде:

syntax error in expression "a eq b"

Я пытаюсь это исправить, добавив interp alias перед всем, как это:

interp alias {} eq {} ==

но, похоже, это не имеет никакого эффекта.

Есть ли способ сделать eq псевдонимом для ==?Если нет, единственный способ избавиться от этой ошибки - заменить все операторы eq на операторы ==?

Ответы [ 3 ]

4 голосов
/ 01 ноября 2010

Операторы eq и ne были введены в Tcl 8.4.См. Изменения в Tcl / Tk 8.4 в вики Tcler.Невозможно сделать «eq» псевдонимом «==» в выражении.Ваша попытка использовать команду псевдонимов привела только к созданию команды с именем eq, которая делает то, что делает команда == (в частности, потерпит неудачу, если у вас нет команды с именем ==).

Если выабсолютно необходимо найти способ заставить это работать, в вашем интерпретаторе 8.3 вы можете переименовать expr во что-то другое (например, _expr), а затем создать собственную команду expr, которая выполняет подстановку строк перед вызовом переименованной команды expr.Это чревато опасностью, так как вы должны убедиться, что заменяете только операторы, а не сравниваемые данные.

1 голос
/ 01 ноября 2010

Я даже не уверен, что этот код работает правильно в tcl 8.5

Сначала убедитесь, что ваш expr находится между фигурными скобками:

% expr {"a" eq "b"}

Псевдоним позволяет вам создать псевдоним для команды, но eq - это не команда, это подкоманда команды expr, поэтому вам действительно нужно создать собственную оболочку proc expr args.

Зачем вам использовать tcl 8.3? это действительно старая версия.

0 голосов
/ 02 ноября 2010

Tcl 8.3 довольно старый, и рекомендуемый путь для обновления с TclPro (как я вижу, вы используете из комментариев) до чего-то менее ... допотопного ... это покупка Tcl Dev Kit от ActiveState, который является по крайней мере духовнымпреемник и имеет текущую поддержку.Никто больше не поддерживает TclPro.


Тем не менее…

Теперь с Tcl 8.3 эквивалентом функциональности оператора eq была команда string equal (в 8.4,они на самом деле компилируются в один и тот же байт-код (один является сокращением для другого).Это означает, что для этого:

if {"a" eq "b"} {...

вместо этого будет записано так:

if {[string equal "a" "b"]} {...

хотя, если у вас определенно есть нецелое число для одногоиз аргументов, вы можете просто использовать это:

if {"a" == "b"} {...

Существует механизм нет для псевдонимов операторов в любой версии Tcl (ну, конечно, не до 8.6, который является текущимразработка / бета-версия).


Захватывающая рука

Как говорит Брайан, вы можете написать свои собственные версии exprif и for и while), которые имеют эту расширенную функциональность, но это большая работа (т. е. месяцы, включая все тестирование, хотя вы, вероятно, можете использовать набор тестов из Tcl 8.4, чтобы помочь), и это просто так, что вы можете использовать версию Tcl, котораякак известно, устарели.(Я не знаю, есть ли в нем проблемы с безопасностью, и вы не можете заплатить мне достаточно, чтобы я попытался это выяснить.) Вам лучше заплатить за TDK.

...