Выпуск SBCL 2.3.11, реализации языка Common Lisp

Опубликован выпуск 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 никогда не должен быть отрицательным.

Источник: http://www.opennet.ru/opennews/art.shtml?num=60193