picolisp.ru
Переключить темный/светлый/авто режим Переключить темный/светлый/авто режим Переключить темный/светлый/авто режим Back to homepage

Плюсы и минусы PicoLisp

Оригинал здесь

Это перевод второй статьи из цикла "Введение в PicoLisp".

В статье описаны плюсы и минусы языка PicoLisp. Обзор достоинств и недостатков будет кратким, более подробно они будут рассмотрены в следующих статьях.

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

В оригинале Mia Temma сообщает, что статья навеяна логически-философским трактатом немецкого философа Людвига Витгенштейна.

Трактат представляет из себя утверждения, организованные в такую привычную в наши дни древовидную структуру:

  1. утверждение 1
    1. утверждение 1.1
      1. утвержление 1.1.1
      2. утверждение 1.1.2
    2. утверждение 1.2
  2. утверждение 2

в которой каждый глубжележащий пункт уточняет вышележащий. Для своего времени такой способ изложения наверняка был передовым изобретением.

Веб-приложение, написанное, естественно, на picolisp и находящееся здесь, описывает достоинства и недостатки языка в виде древовидного списка. Можете посмотреть.

Достоинства PicoLisp

  • Простота
    • Простота не в смысле малого количества возможностей
    • Простота в смысле малого количества концепций
  • Прозрачность
    • Соответствие 1:1 между внешним и внутренним представлением
    • Интерактивный доступ к структуре запущенного приложения
  • Сила
    • Сила не в смысле скорости исполнения
    • Но в смысле выразительности
    • FEXPRs (самому страшно)
    • Ортогональность
    • Интегрируемость
    • Эквивалентность кода и данных
    • Встроенная база данных
    • Краткость
  • Эффективность
    • Эффективность не в смысле скорости исполнения
    • Эффективность в смысле скорости программирования
    • Эффективное использование ресурсов машины

На более глубоких уровнях эти достоинства раскрываются подробнее, можете самостоятельно покликать по пунктам в оригинальном приложении и почитать.

Недостатки PicoLisp

В мире нет ничего совершенного, и даже у такого замечательного языка программирования, как PicoLisp, есть недостатки:

  • Синтаксис LISP
    • Людям не нравится обилие скобочек
  • Только интерпретатор
    • Интерпретируемые программы работают медленнее компилируемых
    • Тем не менее, интерпретируемые программы богаче возможностями, по сравнению с компилируемыми
  • Отсутствуют некоторые возможности
    • Отсутствуют числа с плавающей точкой
      • Вместо них можно использовать числа с фиксированной точкой произвольной разрядности
    • Отсутствуют массивы
    • Отсутствуют потоки
      • Нет потоков, способных обращаться к одной и той же "куче" во время исполнения программы
      • Вместо этого реализовано межпроцессное взаимодействие
      • Есть корутины в качестве кооперативных легковесных потоков
  • Недостаточный контроль за исполнением программы
    • Если не знать особенностей устройства языка, легко вызвать segfault.

Анализ веб-приложения "Tractatus"

"Трактат" - прекрасная иллюстрация силы picolisp: показана возможность написать динамически формирующуюся HTML-страницу в несколько строчек кода.

Давайте загрузим код приложения и взглянем на него глазами человека, который ни разу до этого не работал с PicoLisp.

Загрузка кода

Чтобы загрузить код, введите команду:

wget https://gitlab.com/picolisp-blog/single-plage-scripts/-/raw/main/tractatus/tractatus.l

Или перейдите по ссылке и скачайте код вручную.

Запуск программы

В папке со скачанным скриптом выполните команду:

pil tractatus.l

Теперь перейдите в своём браузере по адресу localhost:8080. Вы должны увидеть страницу, которая выглядит вот так:

Первое впечатление

Вторая задача статьи (после описания достоинств и недостатков picolisp) - показать, как выглядит код на этом языке. Если вы раньше работали только с Python или JavaScript, то код может показаться весьма непонятным.

Попытайтесь посмотреть на код и попробовать понять, что в нём происходит, не получая никакой дополнительной информации.

Открытие первое: функция level

Если открыть файл tractatus.l, то в нём легко найти место, где все достоинства и недостатки перечислены в виде текста с отступами различной глубины:

# Text
Pro
   Simple
      Simple NOT in the sense of "small number of features"

Поскольку нумерация в тексте отсутствует, должен быть какой-то алгоритм, который будет её добавлять. Можно догадаться, что делает это функция level, в которой можно увидеть термин sp?, который, должно быть, представляет знаки "пробелов".

# Content
(de level (Lst)
    (for (I . C) Lst
        (NIL (sp? C) I) ) )

Открытие второе: функция menu

Функция level вызывается из функции menu:

[<menu>
    ~(let (L (0)  L1 (prog (skip "#") (line))  L2 (line))
    (recur (L)
        ...
            (let I (level L1)
                (loop
                    ...

Мы видим две переменных, L1 и L2, которые, вероятно, могут быть двумя соседними строками. Программа обрабатывает строки в цикле и вызывает для соседних функцию loop. Мы также знаем результат работы функции: кликабельные пункты, при нажатии на которые появляются подпункты. Это напоминает нам... (барабанная дробь) меню навигации, верно?

Код преобразует строки в меню навигации, которое потом вставляется в HTML-страницу.

Открытие третье: обработка HTML и CSS

Если вы хоть немного занимались веб-программироваением, то знаете, что браузер обычно ожидает не только HTML-файл, но ещё и CSS. Однако весь наш код состоит из одного файла picolisp!

Так происходит потому, что PicoLisp создаёт всё из исходного кода. Браузер считает, что получает файл CSS, однако он получает всего лишь результат работы функции:

# CSS
(de tractatus.css ()
    (httpHead "text/css" 86400 "!tractatus.css")
    (ht:Out *Chunked
        (prinl "html {background-color: #eee}")
        (prinl "body {margin: auto; max-width: 96ex; border: 1px solid #bbb; font: 20px serif; background-color: #ffd; padding: 2em 5% 4em 5%}")
    ...

Файлы, которые получает и отображает браузер, отдаются в виде потока текстовых символов с помощью функции HttpEcho:

# Source
(de tractatus.l ()
    (httpEcho `(pack (car (file)) (cadr (file))) "text/octet-stream" 3600 T) )

Открытие четвёртое: сервер

Если браузер является клиентом, то где-то должен быть и сервер? И действительно, в самом конце файла с программой вы его найдёте:

(server (or (format (sys "PORT")) 8080) "!tractatus")

Теперь вы знаете, почему доступ к программе можно получить по адресу localhost:8080.

Заключение

Что же, в самых общих чертах мы рассмотрели достоинства и недостатки языка PicoLisp. Также мы рассмотрели первый пример программы на этом языке. Не погружаясь в детали мы увидели, что можно создать сервер и веб-контент всего в несколько строчек кода. Если вам интересно, как именно работает этот код - вы узнаете об этом из циклов "Введение в PicoLisp" и "Основы создания веб-приложений". Конечно же, вы можете найти подробную документацию и учебные материалы на сайте PicoLisp.