Последнее время я часто работаю на относительно старом "железе". И хотя меня практически всё устраивает, ожидание запуска очередной программы - не то, за что я люблю свой компьютер... Ввиду того, что я также часто пользуюсь терминале, появилось желание установить какой-нибудь консольный калькулятор. Встроенные в Linux вещи типа bc или dc по тем или иным причинам мне не подошли, обзор репозитория также не впечатлил. И тут я вспомнил про интерпретаторы языков программирования...
Главная "проблема" заключается в том, что Lua, в отличие от того же Python, не выводит по-умолчанию, результат расчёта, если он не вызван через print(), или перед ним не стоит знак '='. Т.е. вот так должно быть записано одно и то же выражение в этих двух интерпретаторах, чтобы получить числовое значение:
Python
> 2+2
4
Lua
> = 2+2
4
Для решения этой проблемы можно было бы написать свой интерпретатор Lua или скопировать существующий с возможностью 'pretty print', которых в сети достаточно, но я решил оставить всё как есть и ограничиться минимальными изменениями.
Вторая проблема - необходимость обращаться к math при вызове специальных функций, типа math.sin() или math.abs(). Для её решения я воспользовался тем, что функции в Lua - объекты первого класса, т.е. можно без проблем копировать их имена. Итак, создадим файл с расширением .lua и запишем туда все необходимые функции:
sin = math.sin
cos = math.cos
ln = math.log
и т.д.
Если вызвать интерпретатор Lua с флагом '-i', то он отработает содержимое файла и перейдёт в обычный режим работы. Т.е. все синонимы будут загружены, и можно будет обращаться к функциям по их сокращённым названиям.
Данный файл удобен ещё и тем, что в нём можно определить дополнительные функции. Синтаксис очень напоминает MATLAB. Например, следующий блок позволяет получать новую функцию из строкового выражения (fcreate) и вычислить корень методом хорд как для функции, представленной на языке Lua (fsolve), так и для строки (solve).
Например
> = solve("sin(x)-cos(x)", 0, 3.14)
0.785422395
Если на вашем компьютере установлена программа Gnuplot и путь прописан в PATH, можно использовать её для построения графиков.
Если указать в качестве аргумента только имя функции (plot("sin(x)")), диапазон абсцисс определится по-умолчанию, но его можно задать явно (plot("sin(x)", 0, 3.14)).
На своём компьютере я прописал новый алиас в .bashrc
alias lc='lua -i путь_к_calc.lua'
Теперь при вызове команды lc у меня запускается интепретатор Lua, готовый к выполнению нужных мне математических расчётов.
Моя версия calc.lua
P.S. Начиная с версии интепретатора Lua 5.3, не обязательно ставить знак равенства перед выражением, чтобы отобразить его результат.
P.P.S. Увидеть, во что эволюционировал проект, можно на github:lc
P.S. Начиная с версии интепретатора Lua 5.3, не обязательно ставить знак равенства перед выражением, чтобы отобразить его результат.
P.P.S. Увидеть, во что эволюционировал проект, можно на github:lc
Комментариев нет:
Отправить комментарий