Первый проект: Архитектура мысли

Теперь, оставив теорию позади, давайте создадим ваш первый проект на Lispex. Почувствуйте на собственном опыте, как маленькая идея воплощается в коде и обретает жизнь. Всякое творение начинается с первой строки кода.

Добро пожаловать в ваш первый проект на Lispex через веб‑трансформер LENA code! В «Начале работы» вы узнали, как конвертировать Lispex в целевой язык и запускать код его обычными средствами. Сейчас создадим небольшую, но полноценную программу, которая обрабатывает данные и выводит форматированный отчёт.

Цель

Мы напишем программу, которая:

  1. Определяет список задач, каждая из которых имеет имя и приоритет.
  2. Фильтрует этот список, чтобы найти только задачи с высоким приоритетом.
  3. Форматирует задачи с высоким приоритетом в читаемые строки.
  4. Выводит итоговый отчет в консоль.

Это научит вас, как определять структуры данных, создавать вспомогательные функции и использовать мощные встроенные функции вместе с модулями стандартной библиотеки, такими как io и string.

Шаг 1: Откройте LENA code (без локального файла)

Откройте https://www.lenacode.com. Новый файл Lispex автоматически называется LENA_001.lspx. Вставьте код ниже в левый редактор (Input).

Шаг 2: Определите данные

Сначала давайте определим наш список задач. Мы будем использовать переменную с именем tasks для хранения списка списков. Каждый внутренний список будет содержать имя задачи (строку) и ее приоритет (число, где чем выше значение, тем важнее задача).

;; LENA_001.lspx (автоимя в LENA code)

;; Определяем наши исходные данные: список задач.
(define tasks
  (list (list "Написать документацию" 2)
        (list "Исправить критическую ошибку" 3)
        (list "Провести рефакторинг основного движка" 3)
        (list "Добавить новую функциональность" 1)
        (list "Спланировать маркетинговую кампанию" 2)))

Шаг 3: Напишите вспомогательную функцию

Хорошей практикой является разделение логики на небольшие, повторно используемые функции. Давайте создадим функцию, которая проверяет, является ли задача «высокоприоритетной» (мы определим это как приоритет 3 или выше).

;; (Добавьте это в тот же LENA_001.lspx)

;; Вспомогательная функция, которая возвращает `#t`, если приоритет задачи ≥ 3.
;; `(list-first (list-rest task))` -- это распространённая идиома в языках семейства Lisp 
;; для получения второго элемента списка.
(define (is-high-priority? task)
  (>= (list-first (list-rest task)) 3))

Шаг 4: Обработайте данные для отчета

А теперь самое главное! Мы объединим в цепочку встроенные функции, чтобы преобразовать наши исходные данные tasks в итоговый список отформатированных строк отчета.

  • filter будет использовать нашу функцию is-high-priority?, чтобы создать новый список, содержащий только задачи с высоким приоритетом.
  • map возьмет этот отфильтрованный список и применит lambda-функцию для форматирования каждой задачи в удобную для чтения строку, используя str-concat для безопасности.
;; (Добавьте это ниже, всё в 001.lspx)

;; 1. Фильтруем список задач.
(define high-priority-tasks (filter is-high-priority? tasks))

;; 2. Преобразуем отфильтрованный список в новый список отформатированных строк отчета.
(define report-lines
  (map (lambda (task)
         (string-append "СРОЧНО: " (list-first task)))
       high-priority-tasks))

Шаг 5: Выведите итоговый отчет

Наша переменная report-lines теперь содержит данные, которые мы хотим отобразить. Чтобы фактически показать их пользователю, нам нужно выполнить «действие ввода-вывода» (I/O). Мы будем использовать функцию println, которую импортировали ранее, применяя ее к каждой строке нашего отчета.

;; (Добавьте это в конце 001.lspx)

;; 3. Выводим каждую строку отчета в консоль.
;; (Добавьте этот код в task_report.lspx)

(println "--- Отчет по задачам с высоким приоритетом ---")
(map println report-lines)
(println "---------------------------------------------")

Шаг 6: Конвертируйте и запустите в целевом языке

В LENA code выберите Output язык и нажмите Transform. Скопируйте результат и запустите его обычными средствами этого языка. Примеры:

  • Python: сохраните как report.py, выполните python report.py
  • Node.js (TypeScript): сохраните report.ts, выполните tsx report.ts (или транспилируйте в JS и node report.js)

Ожидаемый результат:

--- Отчет по задачам с высоким приоритетом ---
СРОЧНО: Исправить критическую ошибку
СРОЧНО: Провести рефакторинг основного движка
---------------------------------------------

Заключение

Поздравляем! Вы создали полноценную программу на Lispex. Вы освоили структуру кода, определение данных и функций, а также мощный паттерн filter/map для элегантного преобразования данных в отчёт. С помощью трансформера выбирайте любой необходимый рантайм.

Теперь попробуйте изменить программу:

  • Измените пороговое значение приоритета в функции is-high-priority?.
  • Измените формат отчета в lambda-функции, передаваемой в map.
  • Добавьте больше задач в исходный список tasks.