Поскольку мы установили, что Hyperlambda — это уникальный метаязык программирования, обладающий способностью динамически конструировать графовые объекты, возникает естественный вопрос; "Как мы можем модифицировать эти графовые объекты?" Ответ на этот вопрос почти так же прост для понимания, как и сам CRUD, потому что в ядре Hyperlambda существует несколько слотов, способных модифицировать ваши деревья выполнения. Основные из них следующие.

  • [set-value] — изменяет значение узла.
  • [set-name] — изменяет имя узла.
  • [add] — добавляет узлы в дочернюю коллекцию другого узла.
  • [insert-before] — вставляет узлы перед указанным узлом.
  • [insert-after] — вставляет узлы после указанного узла
  • [remove-nodes] — удаляет указанные узлы.

Приведенный выше список слотов позволяет вам ортогонально изменять ваши древовидные структуры так, как вы считаете нужным. Ниже приведен пример использования слота [add] со статическим источником.

.destination
add:x:@.destination
   .
      foo:bar

Выполнение вышеуказанного в вашем Оценщике приводит к следующему.

.destination
   foo:bar
add:x:@.destination

Все вышеперечисленные слоты также можно комбинировать. Например, в приведенном выше примере список статически объявленных узлов добавляется в узел [.destination]. Иногда вам нужно добавить узлы из одного набора узлов в другой, и тогда вы можете объединить узел [add] со слотом [get-nodes], например показано ниже.

.src
   foo1:bar1
   foo2:bar2
   foo3:bar3
.destination
add:x:@.destination
   get-nodes:x:@.src/*

Если вы выполните приведенную выше гиперлямбду в оценщике, ее результат будет похож на следующий.

Такой простой трюк, показанный выше, позволяет вам полностью контролировать то, как вы создаете и изменяете свои лямбда-объекты. Слоты [set-name] и [set-value] работают аналогичным образом, либо принимают статически объявленное значение, либо какой-либо другой вложенный слот, извлекающий источник. Ниже приведен пример.

.dest1
.dest2
.src1:foo
set-value:x:@.dest1
   .:value
set-name:x:@.dest2
   get-value:x:@.src1

После выполнения вышеуказанного в вашем компоненте Magic Evaluator вы получите следующий результат.

.dest1:value
foo
.src1:foo
set-value:x:@.dest1
   .:value
set-name:x:@.dest2
   get-value:foo

Лямбда-преобразования

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

Это то, что позволяет вам начать с чего-то и закончить чем-то другим, что, конечно же, является требованием для динамической генерации кода. Следовательно, в основе Magic лежит буквально все о «трансформациях».

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

Развлечение с базой данных

Предполагая, что вы уже установили базу данных Chinook, давайте создадим новый файл в Hyper IDE, назовем наш файл foo.get.hl и поместим этот файл в наш chinook. папка. Ниже приведен скриншот того, как создать новый файл в Hyper IDE.

Убедитесь, что вы выбрали папку «chinook», прежде чем нажимать кнопку «Новый файл». Это вызовет модальное диалоговое окно, похожее на следующее. Убедитесь, что вы назвали свой файл "foo.get.hl".

Это создаст для вас новую конечную точку HTTP GET, куда вы сможете поместить любую гиперлямбду, которую пожелаете. Скопируйте и вставьте следующую гиперлямбду в файл, а затем нажмите кнопку меню действия «Активировать файл/Сохранить».

sqlite.connect:chinook
   sqlite.select:@"select ar.Name, count(*) as count
     from Album al, Artist ar where al.ArtistId = ar.ArtistId
     group by al.ArtistId
     order by count desc
     limit 5"
   return:x:-/*

Ниже приведен скриншот того, как это должно выглядеть при сохранении файла.

Обратите внимание, что вы также можете использовать сочетание клавиш ALT+S в Windows или OPTION+S в Mac, чтобы быстрее сохранять активные файлы.

Если вы щелкнете по меню действий под названием «Активный файл/Вызвать…», вы сможете немедленно вызвать конечную точку HTTP. Это должно выглядеть следующим образом.

Обратите внимание, что ключевое слово [return] просто возвращает список узлов. Вы можете заменить код приведенным ниже кодом, что даст вам «странный результат».

sqlite.connect:chinook
   sqlite.select:@"select ar.Name, count(*) as count
     from Album al, Artist ar where al.ArtistId = ar.ArtistId
     group by al.ArtistId
     order by count desc
     limit 5"
   return-nodes:x:..

Вышеупомянутое, конечно, возвращает весь ваш лямбда-объект в виде JSON обратно вашему клиенту, что возможно только потому, что принципиально в Magic нет разницы между кодом и данными. Ниже приведены части результата, к которому приведет вызов вышеизложенного.

[
  {
    "sqlite.connect": {
      "sqlite.select": [
        {
          "Name": "Iron Maiden",
          "count": 21
        },

Континуум пространства-времени гиперлямбда

В некотором смысле это вычислительный эквивалент пространственно-временного континуума, где нет разницы между пространством и временем, точно так же, как Гиперлямбда не различает код и данные.

В коде Hyperlambda IS данные и наоборот

Поначалу это очень странно, если вы создали программное обеспечение на традиционном языке программирования, но через некоторое время оно становится легко понятным и освобождает ваш разум в труднопонятных поначалу направлениях. И самое главное конечно…

Это позволяет машине создавать код