Песочница

Первый проект

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

Это предыдущая редакция документации. Чтобы написать и выполнить правило возврата, начните с актуального руководства «Первое правило принятия решения». Обработка списков описана в разделе «Работа с map, filter, fold и apply».

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

Цель

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

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

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

Шаг 1: Создайте локальный файл

Создайте файл task-report.lspx. Пока вы экспериментируете, те же фрагменты можно вставлять в Песочницу.

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

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

LISPEX
;; task-report.lspx

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

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

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

LISPEX
;; (Добавьте это в тот же task-report.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 для безопасности.
LISPEX
;; (Добавьте это ниже, всё в 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, которую импортировали ранее, применяя ее к каждой строке нашего отчета.

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

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

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

Шаг 6: Запустите программу

Запустите файл через CLI:

BASH
lispex run task-report.lspx

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

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

Заключение

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

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

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