Опубликован выпуск SBCL 2.3.11 (Steel Bank Common Lisp), свободной реализации языка программирования Common Lisp. Код проекта написан на языках Common Lisp и Си, и распространяется под лицензией BSD.
В новом выпуске:
- Небольшие несовместимости:
- Потоки с параметром external-format, определённым с помощью “:REPLACEMENT”, будут применять данные для замещения информации один раз в потоке, что приводит к ошибкам декодирования (а не так, как в некоторых случаях, один раз для последовательности байтов каждый из которых не является допустимой стартовой позицией символа для этого external-format).
- Определители external-format при использовании неподдерживаемых или нераспознанных вариантов теперь будут сигнализировать об ошибке.
- Улучшения:
- В процессе диспетчеризации обобщённых функций, использующих стандартный или короткий метод комбинирования, при отсутствии главных применимых методов система будет вызывать обобщённую функцию SB-PCL:NO-PRIMARY-METHOD, чьё стандартное поведение заключается в сигнале об ошибке. Пользователи могут определять методы для этой обобщённой функции.
- Внешние форматы теперь поддерживают варианты новой строки для однобайтовых и utf-8 кодировок.
- Сигнализируемые функциями потоков или октетов ошибки о кодировании и декодировании символов теперь поддерживают USE-VALUE перезапуск для обработчиков, предоставляющих замещения для ввода или вывода.
- READ-SEQUENCE и WRITE-SEQUENCE поддерживают последовательности, определяемые пользователем; стандартная реализация обрабатывает элемент за элементом, читая или записывая один байт или символ в/из потока соответственно.
- Оптимизации:
- Внешние форматы с :REPLACEMENT более не привязывают обработчики для ошибок функций конверсии, что должно уменьшить число cons-операций и увеличить производительность.
- Если :EXTERNAL-FORMAT выступает в роли аргумента для STRING-TO-OCTETS или OCTETS-TO-STRING и является константой во время компиляции, то внешний формат разрешается во время загрузки, а не при каждом вызове.
- Компилятор может ограничивать типы аргументов для некоторых функций исходя из выведенного или подразумевающегося типа значения, которое возвращается этой функцией.
- Компилятор сокращает число избыточных проверок типов в функциях, подобных ASSOC и GETF.
- Исправления ошибок:
- OCTETS-TO-STRING корректно сигнализирует или применяет замены при использовании однобайтовых внешних форматов для нешироко распространённых кодировок (например, iso-8859-3), а не берёт биты из адреса NIL и не конвертирует эти биты в символы.
- FILE-STRING-LENGTH теперь возвращает NIL если входные значения не кодируются во внешний формат потока.
- Табличные многобайтовые внешние форматы (EUC-JP, Shift-JIS, GBK) теперь учитывают замещающий символ (во внешнем формате или посредством перезапуска) при кодировании в октеты.
- Конвертирование из октетов с помощью внешних форматов UCS-2, UCS-4 и UTF-32 более не читает конец массива октетов с нецелым числом двух- или четырёхбайтовых единиц.
- Конвертирование из октетов с помощью внешних форматов UCS-2, UCS-4 и UTF-32 теперь возвращает простую строку, как того требует определение типа OCTETS-TO-STRING.
- Применение некорректного внешнего формата аргумента для OPEN или WITH-OPEN-FILE (или внутреннее MAKE-FD-STREAM) более не приводит к утечке файлового дескриптора.
- SB-ROTATE-BYTE определяет спецификации BYTE за пределами допустимого значения перед выполнением cons очень больших целых чисел для использования масок и сдвигов.
- Исправление вывода типа при компилировании SB-ROTATE-BYTE форм с ненулевым POSITION в определении байта.
- Исправление нескольких ошибок ассемблера при компилировании MAKE-ARRAY, MAKE-STRING и прочих с большим постоянным размером.
- Исправление внутренней ошибки при компилировании (SETF-SBIT) с большим постоянным индексом.
- Исправление внутренней ошибки компилятора для лямбда-функции с некорректным списком параметров в LABELS.
- Исправление внутренней ошибки компилятора при компилировании некоторых бесконечно-рекурсивных форм LABELS.
- Исправление внутренней ошибки компилятора при попытке встроить переход к уже удалённой метке.
- FILL-POINTER никогда не должен быть отрицательным.
Release.
Ссылка here.