Гиперлямбда: введение

Гиперлямбда: введение

9 марта 2022 г.

Цель Hyperlambda — иметь язык программирования, который позволяет вашему компьютеру генерировать большую часть вашего кода. Однако иногда вам нужно вручную изменить сгенерированный код самостоятельно и/или создать код Hyperlambda вручную, после чего вам нужно будет понять Hyperlambda. Однако Hyperlambda чрезвычайно прост в освоении, и вы, вероятно, сможете освоить большинство ее основ менее чем за 10 минут. Эта статья представляет собой введение в Hyperlambda и дает вам обзор Hyperlambda с точки зрения птицы.


Структура


Синтаксически Hyperlambda напоминает YAML, однако у него есть свой уникальный синтаксис, и хотя он имеет те же черты читабельности, что и YAML, он не то же самое. Теоретически мы могли бы использовать YAML, JSON или XML для создания Hyperlambda, но это увеличило бы его многословность, что привело бы к более сложному для чтения коду. Однако его структуру легко понять за 5 минут, так как это буквально просто текстовое представление древовидной структуры. Структура Hyperlambda основана на «узлах»*, и каждый узел имеет 3 свойства.


  • Имя

  • Стоимость

  • Дети

Чтобы проиллюстрировать, представьте себе следующую Hyperlambda.


.данные


foo1:bar1


foo2:бар2


Вышеупомянутая Гиперлямбда состоит из 3 узлов. Первый узел называется [.data]. У этого узла есть два дочерних узла с именами [foo1] и [foo2]. Оба этих узла имеют значения "bar1" и "bar2". Двоеточие разделяет имя узла и его значение, а 3 пробела открывает дочернюю коллекцию. Чтобы поиграть с Hyperlambda, вы можете использовать компонент Magic "Evaluator". Ниже приведен скриншот чуть более сложного примера.


Оценщик Hyperlambda


Приведенный выше пример, конечно, более сложен, чем наш первый фрагмент кода, но он по-прежнему следует той же самой структуре: имя/значение/дочерние элементы. В приведенном выше примере узлу [while] передаются два дочерних аргумента; Один узел условия является его [lt] частями, а другой лямбда-объект является его [.lambda] частями. Цикл [while] будет выполнять свой объект [.lambda] до тех пор, пока его условие истинно. Условие снова является [lt] условием, подразумевающим "меньше чем". Таким образом, перевод приведенной выше гиперлямбды на английский язык становится следующим.


Выполнять .lambda, пока .no имеет значение меньше 20


Внутри [.lambda] мы создаем запись в журнале, прежде чем увеличивать значение [.no]. Magic содержит много похожих условий, таких как "больше чем", "равно" и т.д. - в дополнение к множеству дополнительных "ключевых слов". Полный список см. в документации magic.lambda.


Код — это данные


Причина, по которой Hyperlambda так хороша в создании и изменении кода, заключается в том, что в Hyperlambda нет разницы между "кодом" и "данными" — подразумевается, что код является данными. Точно так же, как мы можем изменять структуры данных, такие как XML, YAML или HTML DOM, Hyperlambda позволяет изменять свой код. Если вы хотите изменить вызов на [log.info]


на приведенном выше снимке экрана для [log.error] это так же просто, как добавить следующую гиперлямбду в начало вашего кода.


имя-набора:x:../**/log.info


.:лог.ошибка


Эта черта Hyperlambda позволяет очень легко создавать «саморазвивающийся код», который каким-то образом изменяет существующий фрагмент кода, делая что-то совершенно другое. Эта черта Hyperlambda имеет решающее значение для ее способности автоматически генерировать код и является причиной того, что он может с такой легкостью создавать и генерировать код на 100% автоматически для вас. Когда вы думаете о "насколько странной" Hyperlambda, пожалуйста, поймите причины* ее странности. «Странность» Hyperlambda позволяет нам легко создавать шаблонные фрагменты кода, которые мы используем в качестве основы для некоторого процесса, автоматически генерирующего пользовательский код, путем динамической параметризации нашего кода, чтобы мы могли изменять его в соответствии с нашими конкретными потребностями.


Все есть код


Естественной реализацией вышеизложенного является то, что все данные также являются кодом. Это создает для нас проблему, поскольку мы можем захотеть создать узлы, которые не хотим "выполнять". Это достигается за счет того, что имя узла начинается с ".". Это указывает механизму выполнения Hyperlambda, что этот узел не должен выполняться, а просто игнорируется механизмом выполнения Hyperlambda. Именно это позволяет нам создавать "переменные" и/или узлы, содержащие "данные". Вы можете увидеть примеры таких узлов в наших предыдущих фрагментах кода и скриншотах.


Выражения


Гиперлямбда не имеет «переменных». Это связано с тем, что все является переменной в Hyperlambda, включая вызовы функций, аргументы функций и т. д. Это создает для нас проблему, поскольку нам нужен какой-то механизм для изменения имен узлов, значений узлов и их дочерних коллекций. Вот где выражения входят в картину. Выражение позволяет нам ссылаться на любой узел в нашем объекте Hyperlambda. Пример такого выражения можно увидеть на снимке экрана выше, где наш вызов [get-value] имеет значение :x:@.no. Его часть :x: объявляет его как выражение type*, а часть @.no является фактическим выражением. Выражение похоже на связанные операторы LINQ тем, что это список объектов IEnumerable, которые реагируют друг на друга в цепочке. Ниже приведено несколько более сложное выражение для иллюстрации


точка.


.данные


foo1:bar1


foo2:бар2


foo3:bar3


заданное значение: x:..//.data//foo2


.:Гиперлямбда была здесь


Если вы запустите указанную выше гиперлямбду в компоненте "Evaluator" вашего Magic, вы увидите, что он изменяет значение "bar2" на "Гиперлямбда была здесь". Это связано с тем, что выражение, которое мы даем нашему вызову [set-value], в основном говорит следующее.


Дайте мне корневой узел, затем все его дочерние элементы, затем отфильтруйте все, что не имеет имени «.data», снова найдите его дочерние элементы и отфильтруйте все, что не имеет имени «foo2».


Когда выражение завершает фильтрацию наших узлов, у нас остается только узел [foo2], после чего [set-value] меняет свое значение. Чтобы понять выражения и объявления типов в Hyperlambda, вам может быть полезно прочитать о magic.node, более глубоком изучении как выражений, итераторов, так и системы типизации Hyperlambda. Однако думайте о выражениях как об «указателях на ваш объект Hyperlambda», где каждый указатель состоит из цепочки «итераторов», где каждый итератор отделен косой чертой (/), и ваше выражение в целом может


указывают на ноль или более узлов.


Слоты


Hyperlambda на самом деле не понимает идею вызова функций. Вместо этого все является «слотом» в Hyperlambda. Однако с практической точки зрения "слот" подобен вызову функции в традиционном языке программирования. Magic содержит сотни слотов для всевозможных сценариев, и в документации по Magic мы часто упоминаем их, используя квадратные скобки в жирном* тексте. Следующие слоты являются вашими самыми важными друзьями для модификации частей вашей Hyperlambda.


  • [set-value] — Изменяет значение одного или нескольких узлов

  • [set-name] — Изменяет имя одного или нескольких узлов

  • [add] - Добавляет кучу дочерних элементов к некоторому узлу

  • [insert-before] — вставляет кучу узлов перед некоторым узлом

  • [insert-after] — вставляет группу узлов после некоторого узла

  • [remove-nodes] — удаляет узлы

Комбинируя вышеуказанные слоты, вы получаете все необходимое, чтобы иметь возможность изменять свои объекты Hyperlambda по мере их выполнения, в результате чего получается полный по Тьюрингу язык программирования, хотя технически он не имеет ни функций, ни переменных. Чтобы увидеть, какие слоты доступны, вы можете нажать CTRL+ПРОБЕЛ в Windows или FN+CONTROL+ПРОБЕЛ в Mac, пока ваш редактор кода активен, чтобы открыть раскрывающийся список автозаполнения. Ниже приведен скриншот раскрывающегося списка автозаполнения из Hyper IDE.


Автозаполнение гиперлямбда


Фрагменты


Компонент Magic "Evaluator" содержит множество фрагментов Hyperlambda, иллюстрирующих некоторые аспекты Hyperlambda. Если вы нажмете кнопку * "Загрузить" , вы можете загрузить существующие фрагменты Hyperlambda, демонстрирующие вам некоторые аспекты языка программирования. Самый простой способ начать изучение Hyperlambda — это, вероятно, просмотреть эти фрагменты, понять, что они делают, а затем применить аналогичные конструкции в своей собственной Hyperlambda. Цикл [while]* на первом снимке экрана в этой статье — один из примеров такого фрагмента. Вы также можете сохранять свои собственные фрагменты, когда играете с Hyperlambda. Здесь есть видео, в котором я демонстрирую Hyperlambda и чего с ее помощью можно достичь.


Оркестровка


Hyperlambda — это «язык программирования оркестровки». Это означает, что это язык сверхвысокого уровня, предназначенный для "организации" строительных блоков программирования. По этим причинам некоторые утверждают, что это не "настоящий" язык программирования, что было бы правильной оценкой. Если вы создаете функции быстрой сортировки или алгоритмы рендеринга полигонов в Hyperlambda, вы делаете что-то не так. Hyperlambda не предназначена для фрагментов с большим количеством алгоритмов, хотя технически в ней возможно реализовать что угодно. Чтобы понять позицию Hyperlambda, осознайте, что ее цель состоит в том, чтобы находиться между низкоуровневым кодом, насыщенным алгоритмами, и клиентом, «организуя»* ваши низкоуровневые строительные блоки, предоставляя вам динамические возможности кода в целом.


Hyperlambda для вашего кода — это то же самое, что YAML для ваших конвейеров, конфигураций и кластера Kubernetes, в том смысле, что он позволяет вам «настраивать» ваш код вместе, используя декларативные концепции, из уровня абстракции высокого уровня, где вы не можете не нужно думать о внутренних деталях вашего исполняемого кода. Однако там, где YAML позволяет настраивать развертывание ваших приложений, Hyperlambda позволяет вам «настраивать» ваше приложение вместо ручного кодирования с использованием низкоуровневых языков программирования, таких как C# или Java.


Однако, когда это сказано, вся Magic фактически создана в Hyperlambda, подразумевая ее промежуточное программное обеспечение, IDE, редактор SQL, фактически все, включая crudifier — и вы действительно можете найти этот код внутри своей * «системы». * папка, если вы используете Hyper IDE для проверки ее кода. Если вы используете тяжелую рекурсию, множество вложенных циклов while и десятки временных переменных в своем коде Hyperlambda, вам, вероятно, будет лучше создать эту часть своего кода на C # и представить свой код C # как * "высокоуровневый слот" * вместо этого к вашему промежуточному программному обеспечению.



Также опубликовано [Здесь] (https://docs.aista.com/blog/an-introduction-to-hyperlambda)



Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE