Опубликован релиз GNU Guile 3.0.10, свободной реализации функционального языка программирования Scheme, поддерживающей возможность встраивания кода в приложения на других языках программирования. Guile может быть использован как язык для разработки расширений для приложений, определения конфигурации или разработки компонентов для связи различных примитивов, предоставляемых приложением. Guile является официальным языком разработки расширений для операционной системы GNU.
Основу Guile составляет виртуальная машина, которая выполняет переносимый набор инструкций, генерируемый специальным оптимизирующим компилятором. Виртуальная машина Guile легко интегрируется с кодом приложений на языках Си и Си++. Кроме языка Scheme, для которого реализована поддержка спецификаций R5RS, R6RS и R7RS, в рамках проекта Guile разработаны компиляторы и для других языков, таких как ECMAScript, Emacs Lisp и Lua (в процессе разработки). В состав пакета входит библиотека модулей, в которых реализованы типовые сервисные функции, такие как работа с протоколом HTTP, парсинг XML и использование методов объектно-ориентированного программирования.
Среди изменений в новом выпуске:
- Реализован экспериментальный интерфейс для использования сторонних бэкендов. Разработчикам предоставлена возможность использования имеющегося фронтэнда, преобразующего исходный код во внутреннее представление, и оптимизатора Guile вместе с другими бэкендами, выполняющими генерацию кода.
- Представлен внешний бэкенд hoot для генерации промежуточного кода WebAssembly, который может выполняться в браузере. В будущем не исключено включение WebAssembly в число основных поддерживаемых целей компиляции в Guile.
- Разрешено использование определений “define” в контексте выражений “when”, “unless”, “cond”, “case”, “and-let*” и “with-fluids”.
- Добавлена поддержка механизма custom ports, описанного в диалекте языка Scheme R6RS и позволяющего подключать обработчики для трансформации данных (например, сжатие/распаковка или изменение кодировки символов), обрабатываемых в таких функциях, как
read, write и display. В Guile также предложен модуль “(ice-9 soft-ports)”, предоставляющий интерфейс “soft port”, который позиционируется в качестве более простого аналога “custom ports”. - Добавлена поддержка упрощённого синтаксиса wisp, позволяющего писать более читаемый код, например: define : factorial n if : zero? n . 1 * n : factorial (- n 1) display : factorial 5 newline
вместо (define (factorial n) (if (zero? n) 1 (* n (factorial (- n 1))))) (display (factorial 5)) (newline) - В компиляторе реализовано новое предупреждение, выдаваемое в случае импорта в коде модулей, функции которых не используются.
- Добавлена новая аннотация “maybe-unused”, подавляющая вывод предупреждений о неиспользовании процедур.
- Вывод трассировки стека вызовов теперь обрезается по границе 500 символов, а не 80 (можно изменить через параметр default-frame-width).
- В процедуру “copy-file” добавлен параметр “#:copy-on-write”, позволяющий использовать механизм copy-on-write в поддерживающих его файловых системах.
- Добавлена оптимизация, обеспечивающая inline-развёртывание вызовов процедур с keyword-аргументами.