пятница, 14 октября 2016 г.

Lua как калькулятор с настройками

Последнее время я часто работаю на относительно старом "железе". И хотя меня практически всё устраивает, ожидание запуска очередной программы - не то, за что я люблю свой компьютер... Ввиду того, что я также часто пользуюсь терминале, появилось желание установить какой-нибудь консольный калькулятор. Встроенные в Linux вещи типа bc или dc по тем или иным причинам мне не подошли, обзор репозитория также не впечатлил. И тут я вспомнил про интерпретаторы языков программирования...

Не буду утомлять читателя рассуждениями, почему я не выбрал Python, и не воспользовался чисто математическими пакетами с консольным интерфейсом типа Maxima или Octave, сразу перейду к делу. Lua - легковесный но мощный и быстрый скриптовый язык программирования, а его интерпретатор запускается мгновенно даже на старом железе. Есть, конечно, свои неудобства, но и достоинств достаточно.

Главная "проблема" заключается в том, что 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




       

Комментариев нет:

Отправить комментарий