Найти в Дзене
Kangaroo

Hy-Lang или альтернативный синтаксис python

Оглавление

Почему Hy?

Hy - многопарадигальный язык программирования общего назначения в семействе Lisp. Он реализован как своего рода альтернативный синтаксис для Python. По сравнению с Python, Hy предлагает множество дополнительных функций, обобщений и синтаксических упрощений, как и следовало ожидать от Lisp. По сравнению с другими Лиспами, Hy обеспечивает прямой доступ к встроенным библиотекам Python и сторонним библиотекам Python, позволяя при этом свободно смешивать императивные, функциональные и объектно-ориентированные стили программирования.

Hy VS Python

Первое, что программист Python заметит в Hy, - это то, что он использует традиционный префиксный синтаксис Lisp с тяжелыми скобками вместо синтаксического синтаксиса Python C-like. Например

print ("The answer is", 2 + object.method (arg))

можно записать

(print "The answer is" (+ 2 (.method object arg)))

в Hy-lang. Следовательно, Hy-lang является свободной формой: структура указывается в скобках, а не в пробеле, что делает его удобным для использования в командной строке.

Как и в других Лиспах, значение упрощенного синтаксиса заключается в том, что он облегчает функцию подписи Лиспа: метапрограммирование с помощью макросов, которые являются функциями, которые манипулируют объектами кода во время компиляции для создания новых объектов кода, которые затем выполняются, как если бы они были частью оригинального кода. На самом деле, Hy допускает произвольные вычисления во время компиляции. Например, вот простой макрос, который реализует цикл do-while в стиле C, который выполняется тех пор, пока условие выполняется.

Hy также снимает ограничения Python по смешиванию выражений и операторов, позволяя создавать более прямой и функциональный код. Например, Python не позволяет блокам, которые закрывают ресурс после того, как вы его используете, возвращать значения. Они могут выполнять только набор утверждений:

with open("foo") as o:
f1 = o.read()
with open("bar") as o:
f2 = o.read()
print(len(f1) + len(f2))

В Hy, with возвращает последнее значение:

(print (+
(len (with [o (open "foo")] (.read o))
(len (with [o (open "bar")] (.read o))))))

Чтобы быть еще более кратким, вы можете поместить форму в выражении генератора

(print (sum (gfor filename ["foo" "bar"] (len (with [o (open filename)] (.read o))))))

Наконец, Hy предлагает несколько обобщений для бинарных операторов Python. Операторам может быть дано более двух аргументов (например, (+ 1 2 3)), включая расширенные операторы присваивания (например, (+ = x 1 2 3)).

Компилятор Hy работает путем считывания исходного кода Hy в объекты модели Hy и компиляции объектов модели Hy в объекты дерева абстрактного синтаксиса Python (ast). Затем объекты Python AST могут быть скомпилированы и запущены самим Python, скомпилированы байтами для более быстрого выполнения позже или преобразованы в исходный код Python. Вы даже можете смешивать код Python и Hy в одном проекте или даже в одном и том же файле, что может быть хорошим способом получить удовольствие от работы с Hy-lang.