Я мне часто требуется быстро получить результаты математических выражений. В прошлом, для вычисления результата я использовал пакет Windows Calculator или на средство работы с электронными таблицами, но для этого мне часто приходилось прерывать работу с командной строкой. Я подумал, что калькулятор для командной строки будет полезен, и поэтому написал сценарий Eval.js, который создает калькулятор в командной строке и выводит результаты в десятичной, 16-тиричной и двоичной системах исчисления. В Листинге 1 приведен отрывок этого сценария.

Структура Eval.js

В начале сценарий Eval.js объявляет используемый им набор переменных. Далее он проверяет свойство length множества WScript.Arguments, которое возвращает количество элементов во множестве. Если аргументы командной строки отсутствуют, или первый аргумент - «/?», сценарий выводит на экран короткое стандартное сообщение и заканчивает работу.

Далее сценарий «извлекает» выражение из командной строки. Для этого он создает объект Enumerator, который отвечает за проведение итерации множества WScript.Arguments. В среде JScript, вы должны использовать объект Enumerator для итерации членов множества.

После этого сценарий Eval.js использует выражение «for» для извлечения каждого элемента множества и построения строки в переменной «expr». Строка содержит все аргументы командной строки, разделенные «пробелами». Сценарий использует оператор «условий» «(?:)» для построения строки. Как показано во фрагменте А Листинга 1, если строка в переменной «expr» не пустая, сценарий добавляет к ней «пробел» и следующий аргумент, если пустая - добавляет первый аргумент. После этого сценарий создает строку вывода, содержащую выражение и две новые строки.

Все что осталось сделать сценарию - попытаться вычислить выражение с помощью функции «eval()». Так как переменная «expr» может не содержать корректное выражение языка JScript, функция «eval()» вложена в структуру «try...catch...finally», как показано во фрагменте B. При возникновении ошибки сценарий выводит выражение и сообщение об ошибке, после чего завершает работу с кодом ошибки отличным от нуля. Если ошибок не возникает, сценарий использует метод toString для вывода выражения и результатов выражения в десятичной, 16-тиричной и двоичной формах.

Возможности применения

Для запуска Eval.js используйте выражение командой строки

Eval.js Expression

Где Expression - выражение, которое необходимо вычислить. Вы можете использовать любой корректный вычислительный или поразрядный оператор языка JScript. Например, вы можете использовать оператор «(+)» для сложения чисел или оператор «(/)» для деления чисел. Список операторов языка Jscript приведен на странице http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/js56jsconoperators.asp.

Однако выражение не обязано содержать оператор. Вы можете просто указать десятичное число для просмотра его 16-тиричного и двоичного эквивалентов. Вы можете даже указать 16-тиричное значение для просмотра его десятичного и двоичного эквивалентов. Однако перед 16-тиричной записью числа должен быть указан префикс «0x» или «0X» (например, «0x41»). Имейте в виду, что если в префиксе 16-тиричного числа используется только 0, среда JScript будет вычислять его как восьмеричное число (число, записанное в 8-ричной системе исчисления). Также помните, что вы не можете указать двоичное число для просмотра его десятичного и 16-ричного эквивалентов, так как это не предусмотрено в языке JScript.

При использовании Eval.js необходимо следить за следующими символами, зарезервированными средой:

( ) < > ^ & |

Если выражение содержит любой из этих символов, вы должны заключить его в кавычки (или, что более неудобно, выделить каждый зарезервированный знак символами «^»). Например, выражение «(2 + 3) * 6» должно быть заключено в кавычки, так как содержит символы «(» и «)». Кавычки не считаются частью выражения. Они не дают приложению cmd.exe интерпретировать специальные символы.

Полезное дополнение

Сценарий Eval.js стал для меня необходимым средством при работе с командной строкой. Он также подходит для более специализированных целей, таких как просмотр результатов операций поразрядного сдвига. Мне кажется, он станет полезным дополнением к вашему набору сценариев.


Листинг 1. Отрывок сценария Eval.js
args = new Enumerator(WScript.Arguments);

// BEGIN COMMENT
// Перебор множества «WScript.Arguments» для построения строки, содержащей
// все аргументы командной строки, разделенные «пробелами».
// END COMMENT
// BEGIN CALLOUT A
for (; ! args.atEnd(); args.moveNext()) {
 arg = args.item();
 expr = expr != "" ? expr += " " + arg : arg;
}
// END CALLOUT A

output = expr + "

";

// BEGIN CALLOUT B
try {
 result = eval(expr);
}
catch(err) {
 WScript.Echo(output + "Unable to evaluate that expression.");
 WScript.Quit(1);
}
// END CALLOUT B

WScript.Echo(output + "Dec:	" + result.toString() + "
" +
 "Hex:	" + result.toString(16).toUpperCase()
 + "
" + "Bin:	" + result.toString(2));