Chicken Scheme 6.0.0
Основные библиотеки
- Все модули, определённые малым языком R7RS, теперь доступны в базовой системе.
- Внутреннее представление строк переведено на UTF-8, что делает строки полностью совместимыми с Unicode.
- Модуль
(chicken blob)заменён на(chicken bytevector), содержащий операции с байтвекторами, совместимые с R7RS. Байтвекторы теперь полностью эквивалентны SRFI-4 u8vectors. - Синтаксис чтения для blob (
#${...}) удалён. Байтвекторы можно читать через#u8(...)или#u8"...". char-nameтеперь позволяет удалять именованное определение символа.open-input-fileиopen-output-fileпринимают кодировку файла, поддерживаются UTF-8 (по умолчанию) и Latin-1 (ISO-8859-1).file-read,file-write,set-pseudo-random-seed!иrandom-bytesтеперь требуют аргумент типа байтвектор и не принимают строки.process-fork,process-run,processиprocess*теперь возвращают объект процесса вместо PID; для получения статуса выхода и портов ввода/вывода используются акцессоры записи процесса.process-waitиprocess-signalпринимают в качестве аргумента как PID, так и объект процесса.- Операции блокировки файлов в модуле
(chicken file posix)теперь используют системный вызов flock(2), работают над файлами целиком, потокобезопасны и имеют более простой интерфейс.file-test-lockудалён. read-u8vector,read-u8vector!иwrite-u8vectorудалены — используйте эквивалентные операции из модуля(chicken io).- В модуль
(chicken io)добавленыread-bytevector,read-bytevector!иwrite-bytevector. - Удалён
set-port-name!— используйте сеттер SRFI-17 дляport-name. - В модуль
(chicken port)добавленport-encoding. make-input-portиmake-output-portтеперь принимают опциональные методы порта в виде ключевых аргументов.- Добавлены
make-binary-input-portиmake-binary-output-port. - Локативы на строках теперь индексируются по кодовым точкам, а не по байтам.
symbol-escapeтеперь также контролирует, печатаются символы в экранированном режиме (|...|) или нет.- Печать символов стала строже в определении того, когда символы должны быть экранированы.
- Следующие примитивы перемещены из
(chicken base)в модули R7RS:exact-integer?,exact-integer-sqrt?,vector-copy!,make-parameter,call/cc,open-input-string,open-output-string,get-output-string,input-port-open?,output-port-open?,parameterizeиport?перемещены из(chicken base)в модуль(scheme base).case-lambdaперемещён из(chicken base)в(scheme case-lambda).featuresперемещён из(chicken platform)в(scheme base).write-stringперемещён из(chicken io)в(scheme base), его сигнатура изменена на соответствующую R7RS.define-record-typeперемещён в(scheme base)и стал генеративным, в соответствии с R7RS.
syntax-errorудалён из(chicken syntax)и теперь является макросом, частью(scheme base).record-instance?иmake-record-instanceпринимают несимвольные спецификаторы типов для поддержки генеративных типов записей.- Новый модуль
(chicken number-vector)предоставляет надмножество SRFI-4, включая 64- и 128-битные векторы комплексных чисел; модульsrfi-4по-прежнему доступен, но экспортирует только процедуры, указанные в SRFI-4. - Второй (опциональный) параметр для
loadиload-relativeможет быть окружением или процедурой вычисления. - Псевдонимы модулей
srfi-0,srfi-6,srfi-9,srfi-11,srfi-23,srfi-39иsrfi-98удалены (все они покрываются R7RS). - Модули
r4rs,r5rs,r4rs-nullиr5rs-nullпереименованы в(scheme XXX). - Шестнадцатеричные escape-последовательности в строках и расширенных символах должны завершаться символом
;, в соответствии с R7RS. - Синтаксисы чтения
#ci/#csудалены — используйте маркеры#![no-]fold-case. includeиinclude-relativeпринимают несколько имён файлов, добавленinclude-ci.- В модуль
(chicken platform)добавленinclude-path. - В модуль
(chicken memory representation)добавленnumber-vector-data. define-libraryрасширен поддержкой спецификацииexport-all.- Идентификатор платформы "mingw32" переименован в "mingw".
- Библиотечные процедуры, возвращающие пути, теперь всегда преобразуют их для использования прямых слэшей,
make-pathnameвсегда использует "/" для разделения путей. - В модуль
(chicken syntax)добавленexpand1для однократного раскрытия макроса, также добавлена команда ",x1" для "csi". - Добавлен модуль
(chicken version). delete-file*иdelete-fileтеперь ведут себя согласованно при работе со сломанными симлинками.number->stringтеперь принимает основания до 36, ранее — только до 16 (спасибо Diego A. Mundo).string->numberтеперь более согласованно обрабатывает неоднозначные случаи с символом "i" в основаниях выше 18.make-rectangularвозвращает комплексное число, если мнимая часть является неточным нулём.string->numberи ридер корректно принимают и обрабатывают комплексные числа с отрицательным неточным нулём в качестве мнимой части.imag-partвозвращает точный ноль при передаче не-комплексного числа.maxиminигнорируют значения nan при наличии любого аргумента, не являющегося nan.
Расширитель синтаксиса
syntax-rulesлучше поддерживает завершающие шаблоны с эллипсисами (#1736).
Изменения FFI
- Строки и символы, передаваемые во внешний код, больше не копируются — они передаются напрямую, любые изменения, сделанные внешним кодом, будут видны на стороне Scheme.
- Комплексные числа, структуры C и объединения теперь можно передавать напрямую как аргументы и возвращать как результаты при взаимодействии с кодом на C.
Инструменты
- Опция компилятора и интерпретатора
-r5rs-syntaxпереименована в-r7rs-syntaxи больше не отключает расширенный синтаксис символов (|...|). - Отладчик "feathers" удалён из ядра и теперь доступен как отдельный egg.
- Процедура
set-describer!удалена из модуляcsi. - Программа "csc" теперь принимает флаги инструментов (например, -compiler, -cc и т.д.) с путями, содержащими пробелы, без необходимости заключать их в кавычки. Как следствие, она больше не принимает программы с флагами инструментов, разделёнными пробелами (например, "csc -cc 'gcc -debug'"). Если это необходимо, следует написать короткий shell-скрипт, вызывающий инструмент с нужными флагами.
chicken-installтеперь блокирует директорию кэша во время установки egg.- В формат egg добавлен тип компонента
installed-c-object. - Конфигурационные клаузы
csc-optionsиlink-optionsв спецификациях egg теперь позволяют формамcustom-configпроизводить произвольные вычисляемые опции компилятора и линкера. - Добавлен scripts/smoke-test.sh для автоматизации базового тестирования chicken-core.
Компилятор
- Добавлены опции
-merge-reusable-closuresи-merge-shareable-closures, включающие повторное использование и совместное использование замыканий для уменьшения количества выделений памяти. Эти опции автоматически включаются на уровнях оптимизации 1 (повторное использование) и 2 (совместное использование) соответственно.
Система сборки
- Теперь для подготовки исходников к сборке используется скрипт "configure". Это упрощает использование "make", позволяет проводить более детальные проверки платформы и следует общепринятым конвенциям.
- На Windows минимальная сборка "mingw" больше не поддерживается — требуется POSIX shell и базовый набор утилит командной строки (ранее сборка "mingw-msys"). Рекомендуемым набором инструментов теперь является "w64devkit" Криса Уэлльнса. Идентификатор платформы "mingw-msys" переименован в "mingw".
- Систему теперь можно собирать, используя "zig cc" в качестве замены компилятора/линковщика C.
5.4.0
Исправления безопасности
- CVE-2022-45145: нейтрализованы возможные escape-символы в метаданных egg для предотвращения произвольной инъекции команд ОС во время установки egg; проблему обнаружил Vasilij Schneidermann, который также предоставил необходимые патчи для устранения этой проблемы.
- Опция среды выполнения "-:b" удалена, поскольку была признана слишком небезопасной — она позволяла попасть в REPL из командной строки любой программы.
- Обработка опций среды выполнения усилена: обработка теперь останавливается на первой опции, не относящейся к среде выполнения, либо после "-:", в зависимости от того, что встретится раньше.
Основные библиотеки
- Исправлены декларации типов для
file-select(сообщил Anton Idukov). - Изменён резервный код
create-temporary-{file,directory}на Windows — теперь используется %USERPROFILE%/AppData/Local/Temp, если эта переменная окружения установлена. - Добавлен новый потокобезопасный API для POSIX-сигналов ("make-signal-handler", "signal-ignore" и "signal-default"), существующий API признан устаревшим.
- Добавлен "make-finalizer" для потокобезопасного выполнения финализаторов.
- В
(chicken base)добавлены слабые пары с поведением, аналогичным Chez Scheme. - Добавлен "locative-index", предоставленный Джоном Круасаном.
- В модуль "chicken.flonum" добавлен "fp*+" (fused multiply-add) (предложение Christian Himpe).
- В модуль "chicken.flonum" добавлены специфичные для flonum гиперболические функции и их обратные (предложение Christian Himpe).
- Процедура
process-executeтеперь устанавливает argv[0] в неизменённое имя файла. Ранее часть с директорией отсекалась. - Добавлена поддержка встроенных строк и символов в литералах векторов SRFI-4.
- read-with-source-info теперь документирован и официально поддерживается из модуля
(chicken syntax). read/source-info по-прежнему экспортируется из недокументированного внутреннего модуля(chicken compiler support), но использование его из этого модуля устарело. - В
(chicken module)добавлен "export/rename" для переименования идентификаторов при экспорте. - Значения переменных среды TMPDIR, TMP и TEMP больше не мемоизируются (исправляет #1830).
- Объекты условий, создаваемые процедурами, изменяющими errno, теперь имеют свойство
errno. - "chicken-home" объявлена устаревшей, добавлен "include-path" в модуль chicken.platform.
- Irregex обновлён до upstream-версии 0.9.11 плюс дополнительное исправление для sre->string. Релиз 0.9.11 устраняет несколько проблем, связанных с обработкой UTF-8 (что не должно затронуть CHICKEN), и расширяет определение набора символов 'whitespace, включив вертикальную табуляцию, возврат каретки и разрыв страницы.
Инструменты
- Исправлены скрипты, генерируемые
chicken-installна Windows, чтобы не заключать в кавычки>>при выводе в файлы, что приводило к пустым файлам egg-info (сообщил и исправил Jani Hakala). - Опция -R для csi и csc теперь принимает списочную нотацию, например (srfi 1). Исправляет #1809, сообщил Wolfgang Corcoran-Mathe.
- Исправлено экранирование shell в опциях, передаваемых от csc другим инструментам. Исправляет #1302, сообщил Xin Wang.
- Опции -prelude и -postlude для csc снова работают корректно.
- chicken-install теперь получает последнюю версию egg при инструкции установить egg, который уже установлен (#1802).
- При указании `location` в setup.defaults, chicken-install теперь учитывает две схемы расположения при поиске egg: <location>/<egg> и <location>/<egg>/<version>.
- chicken-install: исправлен #1684 (программы, указывающие зависимости компонентов, должны иметь build-зависимость от их импортных библиотек).
- chicken-install теперь кэширует egg, установленные из локальных расположений.
- chicken-install теперь принимает опцию командной строки -location (короткая форма: -l) для указания локальных директорий, из которых брать исходники egg.
- chicken-install теперь выдаёт предупреждение при неожиданных свойствах (#1492).
- chicken-install теперь использует директорию, специфичную для метаданных кэша (файлы VERSION, STATUS и TIMESTAMP), чтобы избежать коллизий с исходными файлами на файловых системах без учёта регистра, таких как MacOS (#1753, сообщил Kon Lovett).
Расширитель синтаксиса
- При передаче модуля как окружения в eval, идентификаторы в макрорасширениях теперь корректно резолвятся (#1295, сообщил Caolan McMahon).
- Внутренние определения учитывают переопределения базовых специальных форм (#1132).
- Глобальное определение идентификатора, ранее связанного с макросом, теперь полностью затеняет макрос (#1166, сообщил Michele La Monaca).
Компилятор
- При выводе файлов типов список результатов теперь сортируется для обеспечения детерминированной сборки (исправляет #1783, сообщил "ss2").
Система сборки
- Исправлены предупреждения компилятора о нулевом размере
memset(сообщил Claude Marinier). - Отключён неработающий test-create-temporary-file на Windows (сообщил "jjhoo").
- Прекращено использование переменных среды XCODE_... на MacOS.
- Добавлена директория сборки в rpath на MacOS, чтобы набор тестов подхватывал правильную libchicken, даже если CHICKEN уже установлен (спасибо Christian Himpe).
- По умолчанию используется "cc" на BSD-системах для сборки CHICKEN, чтобы избежать проблем ABI при линковке с кодом на C++.
Система выполнения
- Номера строк теперь доступны при выводе ошибок и во время раскрытия синтаксиса как в интерпретаторе, так и в компиляторе.
5.3.0
Основные библиотеки
- В
(chicken process-context posix)сеттеры для current-user-id, current-effective-user-id и current-group-id теперь проверяют, что новое значение пользователя/группы является fixnum, а не передают его напрямую в реализацию на C (что могло привести к установке некорректных id). Исправляет #1787, спасибо Christopher Brannon. - Модуль srfi-17 теперь экспортирует процедуры
getter-with-setterиsetter, а не только макрос set! (спасибо Lassi Kortela). - Исправлено зависание в chicken-install -update-db на Windows (спасибо Mark Fisher за сообщение и Jani Hakala за отладку и патч).
- Исправлена непреднамеренная ошибка при выводе ошибки в процедурах
numeratorиdenominatorпри передаче нефинитных flonum (#1730). - Исправлена ошибка, из-за которой оптимизации для
irregex-match?вызывали ошибки во время выполнения из-за неполного раскрытия встроенных специализаций (см. #1690). - Irregex обновлён до upstream-версии 0.9.10, что исправляет поведение irregex-replace/all с положительным lookbehind, чтобы заменялись все совпадения, а не только первое (сообщила Kay Rhodes), и регрессию, связанную с заменой пустых совпадений, введённую исправлениями в 0.9.7 (сообщила Sandra Snan). Также теперь сокращение http-url принимает любой домен верхнего уровня, а старое "top-level-domain" также поддерживает "edu" (исправлено Sandra Snan). Также исправлена проблема с захватывающими группами внутри звезды Клини, которая иногда возвращала неверные части совпадения. Наконец, исправлена обработка "bol" для согласованной обработки переносов строк, чтобы несколько совпадений не перекрывались (сообщила Sandra Snan).
- current-milliseconds объявлена устаревшей в пользу имени current-process-milliseconds, чтобы избежать путаницы с именованием current-milliseconds versus current-seconds, которые делают совершенно разные вещи. Также её определение скорректировано, чтобы гарантировать возврат времени с момента запуска процесса. На Windows теперь возвращает корректные значения после 24 дней работы. На UNIX возвращаемые значения точны до миллисекунды, а не округлены до ближайшей секунды при старте (что приводило к нестабильному времени запуска).
- Режим по умолчанию для файлов, создаваемых
file-open, изменён на 0666 (плюс изменения от эффективного umask), вместо 0744 (см. #1698). - Исправлена запись в базе данных типов для "log" со вторым аргументом (исправляет #1725).
- topological-sort теперь ведёт себя лучше, когда цель зависимости указана несколько раз, путём конкатенации зависимостей (исправляет #1185).
Модульная система
- Реэкспортированные макросы теперь работают, когда реэкспортирующий модуль переопределяет идентификаторы из оригинала (исправляет #1757, сообщила Sandra Snan).
- При использовании "except" в "import" для исключения реэкспортированных макросов, они действительно не импортируются (#1771, сообщила Sandra Snan).
Система выполнения
- Спящий примордиальный поток больше не забывает мутации, сделанные в параметрах в обработчиках прерываний (см. #1638; фикс предоставил Sebastien Marie).
- Фича, соответствующая размеру машинного слова, теперь доступна независимо от размера слова (#1693).
- Максимальный размер кучи по умолчанию на 64-битных платформах теперь равен теоретическому максимальному адресуемому размеру памяти (#1675). Используйте -:m, если хотите переопределить это во время выполнения.
- C_(a_i_current_)milliseconds объявлена устаревшей в пользу C_(a_i_)current_process_milliseconds, чтобы соответствовать устареванию current-milliseconds на уровне Scheme.
- C_pair() официально объявлена устаревшей в пользу C_a_pair(); фактически устарела уже много лет.
- При завершении программы финализаторы форсируются только при ненулевом количестве живых финализаторов.
- Символ
srfi-87добавлен в список встроенных идентификаторов фич. - Алгоритм сборки мусора изменён для уменьшения "thrashing" при почти заполненной куче, за счёт более раннего роста кучи. Добавлена новая опция -:hf для настройки момента роста кучи.
- Добавлена опция среды выполнения
-:Rдля детерминированной инициализации состояния rand() (должна помочь с #1650 и бенчмаркингом).
Компилятор
- Снова поддерживаются статически линкованные программы, использующие встроенные библиотеки (исправляет #1788, регрессию из 5.2.0).
- Избегается повторное использование argvector, когда встроенные rest-операции используются в CPS-вызовах (#1703, спасибо Jakob L. Keuze).
- Добавлена декларация `emit-types-file`, соответствующая флагу компилятора с тем же именем (#1644, спасибо Marco Maggi за предложение).
- Исправлена ошибка, вызванная плохим взаимодействием двух оптимизаций: операции rest на argvector применялись даже если процедура уже получала свой rest-аргумент, собранный на месте вызова (#1756, спасибо Sandra Snan).
Система сборки
- Исправлена сборка с tcc.
- Исправлены несколько тестов на Windows, чтобы набор тестов снова проходил.
- Автоматическая конфигурация во время сборки на большинстве платформ. Кросс-компиляция всё ещё требует установки PLATFORM, и её можно указать вручную, но это больше не требуется в общем случае.
- Исправлена кросс-компиляция с Linux на MingW (#1768, спасибо Théo Cavignac).
- Цель `clean' для make теперь также удаляет файлы конфигурации сборки.
- Цель `distclean' для make удалена (теперь `clean' делает то, что раньше делал `distclean').
Инструменты
- Исправлена проблема со скриптами установки egg на Windows, где платформа не определялась корректно в зависимости от используемой при установке основной системы оболочки (снова спасибо Mark Fisher за сообщение и помощь в поиске причины).
- Исправлена ошибка в chicken-install (#1744), вызывавшая
Error: (string->number) bad argument type: #!eofв некоторых случаях. - Если у chicken-install есть префикс/суффикс программы, теперь он пишет в директорию кэша, соответствующую имени программы (#1713, спасибо Alice Maz).
- Исправлена ошибка в chicken-install, связанная с экранированием переменных в UNIX-подобных системах, которая мешала установке в пути с пробелами (#1685).
- Исправлена аналогичная ошибка в chicken-install для путей с пробелами на mingw и mingw-msys (#1727, спасибо Josh Helzer за сообщение и Vasilij Schneidermann за патч).
Модульная система
- Исправлена утечка памяти при многократном вызове (import) подряд для одного и того же модуля (#1772; сообщил "plugd" на IRC).
5.2.0
Основные библиотеки
- Исправлена
memory-statistics— теперь возвращает размер semi-space и использованный размер semi-space в байтах, как указано в документации. Старая реализация возвращала полный размер кучи и (полный размер кучи - использованный semi-space). - for-each и map теперь ведут себя согласованно в компилируемом и интерпретируемом режиме, как в SRFI-1. Теперь они останавливаются, когда исчерпан самый короткий список, а не выбрасывают исключение (исправляет #1422).
- Теперь есть модуль srfi-88, содержащий лишь три процедуры из модуля (chicken keyword), определённые этим SRFI.
- Регистрирован идентификатор фичи "srfi-88".
- Добавлены процедуры
record-printerиset-record-printer!, а также соответствующий сеттер SRFI-17. Они делают устаревшимdefine-record-printer, который не является "настоящим" определением (см. #1294). - На Windows
decompose-directoryбольше не крашится, когда в переданном пути присутствует буква диска. - irregex-replace[/all] исправлены для пустых совпадений — теперь они не отбрасывают символы и не игнорируют замену (#1661).
- Irregex обновлён до upstream-версии 0.9.7, которая также улучшает обработку пустых совпадений в irregex-fold и irregex-split.
Система выполнения
- Пустые ключевые слова в кавычках, такие как ||: и :||, теперь читаются согласно предписанному SRFI-88 в соответствующем режиме ключевых слов. Символы, содержащие экранированные пустые префиксы или суффиксы, такие как ||:abc и abc:||, теперь корректно читаются как символы (исправляет #1625, спасибо Andy Bennett).
- Отрицательный ноль IEEE floating point теперь корректно обрабатывается: его можно читать, записывать и различать с помощью eqv? и equal?, но не = (исправляет #1627, спасибо John Cowan).
- ##sys#check-exact и её реализации на C C_i_check_exact и C_i_check_exact_2 объявлены устаревшими (см. также #1631).
- При ручном вызове сборщика мусора из финализатора теперь выбрасывается ошибка вместо бесконечного зависания (исправляет #1586).
- define-record-type теперь выдаёт ошибку, если определение конструктора ссылается на поле, не указанное в других местах (см. #1633).
- Добавлена новая опция -:hu для установки процентного порога низкого использования памяти, при котором куча должна сжиматься, и изменён расчёт, чтобы он действительно это отражал (см. #1379).
Компилятор
- Исправлена ошибка в проходе lfa2, из-за которой узлы "if" или "cond" некорректно раскрывались из бокса, если "else"-ветка имела результат типа flonum (#1624, спасибо Sven Hartrumpf).
- Файлы inline больше не ссылаются на неэкспортированные foreign stub функции (исправляет #1440, спасибо "megane").
- В некоторых случаях списки rest-аргументов не требуют реификации, что должно ускорить использование опциональных аргументов и case-lambda (#1623).
- Значения из foreign-типов, имеющих конвертер аргумента или возвращаемого значения, больше не выводятся как имеющие тип Scheme, соответствующий необработанному foreign-типу, что было некорректно (#1649).
Модульная система
- Попытка экспортировать foreign-переменную, define-inlined процедуру или define-constant переменную теперь выдаёт дружелюбную ошибку вместо сообщения, что переменная не существует (исправляет #1346).
- При регистрации модулей они больше не загрязняют глобальное окружение импортами, сделанными внутри этого модуля (исправляет #1548).
Инструменты
- Новая опция "-module-registration" заставляет код регистрации модуля всегда включаться в программу, даже если он также был выведен как отдельный файл (например, с "-J").
- chicken-install теперь корректно проверяет код ответа сервера, чтобы избежать интерпретации тел ответов с ошибкой (например, 404, 500) как кода на Scheme.
- chicken-install теперь следует HTTP-редиректам при скачивании egg.
- chicken-install теперь переключается на правильный диск перед попыткой перейти в директорию egg (исправляет #1647).
5.1.0
Основные библиотеки
- Символы, заканчивающиеся или начинающиеся двоеточием, теперь всегда экранируются символом трубы при записи через `write`, чтобы гарантировать возможность прочитать их обратно с другим режимом стиля ключевых слов.
- Сохранена инвариантность записи-чтения для специальных символов, начинающихся с #!, кроме #!key, #!rest или #!optional (#1572).
- При использовании (set-file-position!) на порту, его статус EOF теперь сбрасывается.
- В
(chicken file posix)значения perm/irgrp, perm/iwgrp, perm/ixgrp, perm/iroth, perm/iwoth и perm/ixoth теперь определены корректно (ранее все были для "usr"; #1602, спасибо Eric Hoffman). - В
(chicken file posix)file-truncateтеперь также принимает объекты портов, для согласованности с другими файловыми процедурами. Все такие процедуры из(chicken file posix)теперь имеют корректные типы в types.db (исправляет #1609, спасибо Robert Jensen). - Добавлены процедуры system-config-directory и system-cache-directory в модуль chicken.platform. Эти процедуры следуют спецификации XDG и также дают разумные результаты на Windows.
- Исправлена get-environment из (chicken process-context), чтобы выбрасывать ошибку при передаче #f вместо segfault.
- Квалифицированные символы (стиль ##foo#bar) больше не кодируются байтовым префиксом внутри имени символа. Это обеспечивает инвариантность записи-чтения для символов, начинающихся с низкобайтового символа (исправляет #1077, кроме ключевых слов, которые начинаются с байтов NUL).
- Исправлен отсутствующий экспорт (list->s64vector) в SRFI-4.
Система выполнения
- Ключевые слова теперь являются отдельным типом; они не являются подтипом символов.
- Использование arc4random на FreeBSD (спасибо Tobias Kortkamp и gahr).
- Удалены неиспользуемые, недокументированные (и некорректные!) C-функции C_delete_symbol_table и C_set_symbol_table.
- Продолжения, отбрасывающие дополнительные значения кроме первого, больше не принимают несколько значений через прямой вызов после захвата через `call/cc`, только через `values` (откат #1390, из-за #1601).
- Предикаты векторов SRFI-4, референс, установка и процедуры длины теперь должны быть быстрее в тесных циклах, поскольку они инлайнятся (#757).
- Ключевые слова теперь интернируются в отдельной таблице ключевых слов, а не в стандартной таблице символов. Это обеспечивает полную инвариантность записи-чтения для символов (теперь они также могут начинаться с байтов NUL). У ключевых слов больше нет plists. Исправляет #1576.
- Увеличена "версия совместимости двоичного кода" до 11.
Компилятор
- Восстановлены оптимизированные реализации =, +, -, /, * и quotient в режиме fixnum-арифметики (в основном исправляет #1604; спасибо "chickendan").
- Добавлен проход оптимизации для уменьшения объёма упаковки в бокс промежуточных значений с плавающей точкой, включаемый опцией компилятора "-lfa2".
- Проход "lfa2" теперь включён на уровнях оптимизации 2 и выше.
Модульная система
- При попытке импортировать модуль, который в данный момент определяется, в самого себя, будет выброшена ошибка. Это предотвращает бесконечный цикл в компиляторе при последующей попытке импортировать этот же модуль (исправляет #1506, спасибо Kristian Lein-Mathisen).
Интерфейс внешних функций
- Улучшена гигиена в расширениях макросов FFI, что означает, что не нужно импортировать "scheme" или "(chicken base)" для их работы.
Система типов
- Теперь можно квотировать свободные переменные в декларациях типов, что служит сокращением для `forall` (спасибо "megane").
Инструменты
- csi теперь использует (system-config-directory) для поиска csirc и переходит к $HOME/.csirc при необходимости.
- chicken-install теперь использует (system-config-directory) для поиска пользовательского файла setup.defaults; также использует (system-cache-directory) для директории кэша egg, когда переменная окружения CHICKEN_EGG_CACHE не определена.
Спецификации egg
- Разрешены формы "cond-expand" и "error" в файлах спецификации egg.
- Добавлены свойства "c-object" и "object" для линковки отдельно скомпилированных C-объектов в код CHICKEN.
5.0.0
Система выполнения
- Добавлена поддержка полной числовой башни, включая различные новые процедуры, взятые из egg "numbers". Все вычисления теперь будут возвращать точные числа там, где возможно, поэтому код, зависящий от возврата flonum, может потребовать изменений, если рациональные числа не обеспечивают нужную производительность.
- Направленность порта была обобщена от простого флага ввода/вывода до битовой маски, чтобы позволить многонаправленные порты.
- Слабая GC символов быстрее, проще и теперь может собирать все несвязанные символы вместо максимум 997 за одну крупную сборку мусора.
- Опция -:w удалена; символы теперь всегда собираются.
- Увеличена "версия совместимости двоичного кода" до 9.
- Продолжения, отбрасывающие дополнительные значения кроме первого, теперь также принимают несколько значений через прямой вызов после захвата через `call/cc`, а не только через `values` (#1390).
- Удалены устаревшие C-функции C_locative_ref и C_mutate2.
- Буфер трассировки больше не удерживает объекты потоков, позволяя им быть собранными сборщиком мусора раньше (#1356, спасибо Kristian Lein-Mathisen).
- На Cygwin и MinGW "build-platform" теперь соответствует используемой цепочке инструментов (gnu, clang, unknown), как на *nix, а software-version теперь "cygwin" или "mingw32" вместо "unknown". Это также означает, что список фич теперь будет содержать цепочку инструментов на всех платформах.
- Символы, начинающиеся с #%, больше не обрабатываются специально и должны быть заквотированы трубами. Это делает знак "%" доступным для использования в пользовательском синтаксисе чтения sharp-sign.
Компилятор
- Исправлена ошибка off-by-one при выделении в сгенерированном коде C для (list ...).
- Опция компилятора "-scrutinize" удалена.
- Опция компилятора "-module" (псевдоним "-m") теперь требует имя модуля.
- Сгенерированный вывод C компилятора теперь детерминирован: он будет побитово идентичен при компиляции того же файла Scheme той же версией компилятора.
- Опции "-consult-type-file" и "-emit-type-file" переименованы в "-consult-types-file" и "-emit-types-file" соответственно.
Инструменты
- Новая опция "-link" для csc позволяет линковать с объектами из расширений.
- Новая опция "-libdir" для csc позволяет переопределить директорию библиотеки времени выполнения.
- Удалена неоднозначная опция "-l<libname>" для csc (#1193).
- Удалено устаревшее сокращение "-n" для "-emit-inline-file" из csc.
- Удалён инструмент "chicken-bug".
Основные библиотеки
- Удалена поддержка memory-mapped файлов (posix), очередей (data-structures), binary-search (data-structures), scan-input-lines (utils), group-information (posix), object-eviction (lolevel) и compile-file (utils). Теперь эти функции доступны как egg.
- Удалены юниты srfi-1, srfi-13, srfi-14, srfi-18, srfi-69 и utils. Теперь эти функции доступны как egg.
- Добавлена процедура
executable-pathnameдля получения пути к текущему выполняемому файлу. - Удалена вся поддержка SWIG.
- Удалён спецификатор декларации interrupts-enabled.
- `sleep` теперь приостанавливает текущий поток при включённой поддержке потоков, иначе засыпает процесс. Новая процедура `process-sleep` в юните posix может использоваться для безусловного засыпания процесса.
- `with-error-output-to-port' из модуля ports переименован в более распространённое `with-error-to-port', и добавлен `with-error-to-string' для полноты (спасибо Michael Silver).
- В юнит ports добавлена новая процедура `make-bidirectional-port', которая объединяет отдельные входные и выходные порты в единый двунаправленный порт.
- Добавлены новые процедуры `input-port-open?` и `output-port-open?` для проверки, открыт ли порт в определённом направлении.
- В модуль (chicken base) добавлена форма `include-relative`. Она работает как `load-relative`, но для текстового включения.
- Ключевые слова теперь всегда записываются в "переносимом" стиле функцией WRITE, чтобы стиль ключевых слов ридера не должен совпадать со стилем писателя.
- Переменная окружения `CHICKEN_PREFIX` удалена.
- В библиотеку irregex добавлена процедура `glob->sre`.
- Удалены процедуры `get-host-name' и `system-information'. Они доступны в egg "system-information".
- Удалены макросы `eval-when`, `select` и `ensure`. Они доступны в egg "miscmacros".
- Удалён макрос require-extension-for-syntax.
- bit-set? переименована в bit->boolean из-за перепутанного порядка аргументов относительно SRFI-33 и SRFI-60, что вызывало путаницу (исправляет #1385, спасибо Lemonboy).
- file-{read,write,execute}-access теперь выбрасывают исключение, когда файл не существует или обнаружена иная проблема, не связанная с доступом (исправляет #1386, спасибо Vasilij Schneidermann).
- `change-file-mode` переименована в set-file-permissions!, и добавлена поддержка обобщённого set! SRFI-17 для `file-permissions`. Эта процедура теперь также принимает файловый дескриптор или порт.
- `file-permissions` теперь возвращает одно значение: целое число прав доступа.
- `read-file` переименована в `read-list`.
- `read-all` удалена, поскольку `read-string` с #f в качестве аргумента NUM эквивалентна.
- `read-lines` и `read-all` больше не принимают строку с именем файла, только порты.
- Процедуры для случайных чисел переработаны; доступен доступ к системно-специфичной энтропии, вместе с достаточно хорошим генератором псевдослучайных чисел (WELL512).
- `glob` теперь возвращает пустой список для несуществующих или недоступных директорий, вместо выбрасывания ошибки.
- `file-copy' и `file-move' переименованы в `copy-file' и `move-file', для согласованности с `delete-file' и `rename-file'.
- `rename-file' теперь отказывается перезаписывать существующий файл, если не предоставлен опциональный аргумент "clobber".
- Модуль `r4rs` больше не экспортирует `eval`, которого не было в R4RS.
- `process`, `process*` и `process-execute` теперь ожидают списки формы (("NAME" . "VALUE") ...) вместо предыдущего (("NAME=VALUE") ...) в качестве аргумента окружения.
- `repository-path` теперь является параметром, содержащим список строк, а не строку, поскольку путь поиска библиотек теперь может содержать несколько директорий.
- `file-read-access?`, `file-write-access?` и `file-execute-access?` переименованы в `file-readable?`, `file-writable?` и `file-executable?` в модуле (chicken file).
Модульная система
- Компилятор был модуляризован для улучшенного разделения имён. Это означает, что имена из компилятора больше не должны просачиваться в (макро)пространство имён скомпилированной программы.
- Основные юниты преобразованы в модули под пространством имён "chicken".
- Добавлена поддержка имён библиотек в стиле списков.
- Специальные формы "use" и "use-for-syntax" удалены в пользу "import" и "import-for-syntax" для уменьшения путаницы.
- Импорты модулей теперь лексически ограничены: идентификаторы, предоставляемые через (import ...) внутри (let ...), не будут видны за пределами этого let.
- Модули, реализующие интерфейс, теперь могут корректно экспортировать дополнительные идентификаторы (ошибка сообщена Martin Schneeweis, исправление от "megane").
Расширитель синтаксиса
- Удалена поддержка (define-syntax (foo e r c) ...), которая была недокументирована и в любом случае официально не поддерживалась.
- Удалена поддержка обычных форм "lambda" в качестве трансформеров синтаксиса, что было устаревшим с версии 4.8.0.
- define и подобные формы теперь агрессивно отклоняются в "контекстах выражений" (то есть везде, кроме toplevel или внутренних определений).
- define-record и define-record-type теперь создают типы записей, помеченные модулем, в котором они определены, поэтому предикаты больше не возвращают #t для записей с тем же тегом, определённых в другом модуле. Этот тег теперь также доступен под идентификатором, совпадающим с именем типа записи (исправляет #1342).
- `include` теперь встраивает включённые выражения в контекст, в котором происходит включение, и по умолчанию не рассматривает выражения как toplevel-выражения.
Управление egg
- Установка и сборка egg были полностью переработаны.
- Файлы .meta + .setup объединены в единый декларативный файл ".egg".
- Больше статических проверок для описаний egg, упрощённая генерация OS-специфичных команд сборки + установки, что (надеемся) более практично для поддерживающих пакеты.
- Исходники egg кэшируются локально для уменьшения времени скачивания и пересборки.
- Удалены многие малоизвестные или неважные опции и функции из `chicken-install`: (`-keep-installed`, `-reinstall`, `-proxy`, `-no-install`, `-username`, `-password`, `-init`, `-deploy`, `-keep-going`, `-scan`, `-csi`, `-show-depends`, `-show-foreign-depends`, `-prefix`.
- Добавлена новая опция "-from-list" для chicken-install.
- Egg теперь можно устанавливать и находить в нескольких директориях, используя переменные окружения `CHICKEN_REPOSITORY_PATH` + `CHICKEN_INSTALL_REPOSITORY`.
- Статическая компиляция egg теперь полностью поддерживается, и статические версии скомпилированных egg доступны по умолчанию.
- В статически собранном chicken инструменты для egg ("chicken-install", "...-status", "...-uninstall") всё ещё доступны, но поддерживают только статическую компиляцию egg.
Интерфейс внешних функций
- Спецификатор типа foreign "ssize_t" теперь принимается, а аргументы типа "size_t" теперь принимают только положительные целые числа. Возвращаемые значения типа size_t больше не обрезаются на 32-битных платформах.
Более ранние версии
Более ранние релизы (4.13.0 и ниже) содержат преимущественно исправления безопасности, доработки FFI, оптимизации компилятора и улучшения инструментов установки egg (chicken-install, csc), а также многочисленные фиксы в основных библиотеках (posix, irregex, SRFI-модули) и системе сборки для различных платформ (Windows/mingw, BSD, AIX, GNU Hurd, Android/iOS).