Opublikowano wersję SBCL 2.3.11 (Steel Bank Common Lisp), wolnej implementacji języka programowania Common Lisp. Kod projektu został napisany w językach Common Lisp i C, i jest rozpowszechniany na licencji BSD. W nowej wersji:
- Małe niekompatybilności:
- Strumienie z parametrem external-format zdefiniowanym za pomocą ":REPLACEMENT" będą stosować dane do zastąpienia informacji tylko raz w strumieniu, co prowadzi do błędów dekodowania (a nie, jak w niektórych przypadkach, jeden raz dla sekwencji bajtów, z których każdy nie jest dozwoloną pozycją startową symbolu dla tego external-format).
- Definiowane external-format przy użyciu nieobsługiwanych lub nierozpoznawanych wariantów teraz będą sygnalizować błąd.
- Ulepszenia:
- W procesie dyspozycji ogólnych funkcji, używających standardowej lub krótkiej metody łączenia, przy braku głównych stosownych metod system wywoła ogólną funkcję SB-PCL:NO-PRIMARY-METHOD, której standardowymi zachowaniami są sygnalizowanie błędów. Użytkownicy mogą definiować metody dla tej ogólnej funkcji.
- Zewnętrzne formaty teraz wspierają warianty nowej linii dla jednobajtowych i utf-8 kodowań.
- Sygnalizowane przez funkcje strumieni lub oktetów błędy kodowania i dekodowania symboli teraz wspierają USE-VALUE restart dla handlerów, które dostarczają zamienniki dla wejścia lub wyjścia.
- READ-SEQUENCE i WRITE-SEQUENCE wspierają sekwencje zdefiniowane przez użytkownika; standardowa implementacja obsługuje element po elemencie, czytając lub zapisując jeden bajt lub symbol z/do strumienia odpowiednio.
- Optymalizacje:
- Zewnętrzne formaty z :REPLACEMENT nie łączą już handlerów dla błędów funkcji konwersji, co powinno zmniejszyć liczbę operacji cons i zwiększyć wydajność.
- Jeśli :EXTERNAL-FORMAT jest argumentem dla STRING-TO-OCTETS lub OCTETS-TO-STRING i jest stałą w czasie kompilacji, to zewnętrzny format jest rozwiązywany w czasie ładowania, a nie przy każdym wywołaniu.
- Kompilator może ograniczać typy argumentów dla niektórych funkcji w zależności od wywnioskowanego lub domniemanego typu wartości, która jest zwracana przez tę funkcję.
- Kompilator redukuje liczbę zbędnych sprawdzeń typów w funkcjach takich jak ASSOC i GETF.
- Poprawki błędów:
- OCTETS-TO-STRING poprawnie sygnalizuje lub stosuje zamiany przy użyciu jednowyjściowych formatów zewnętrznych dla rzadko używanych kodowań (na przykład iso-8859-3), zamiast brać bity z adresu NIL i nie konwertować tych bitów na znaki.
- FILE-STRING-LENGTH teraz zwraca NIL, jeśli dane wejściowe nie są kodowane w zewnętrzny format strumienia.
- Tablicowe wielobajtowe zewnętrzne formaty (EUC-JP, Shift-JIS, GBK) teraz uwzględniają znak zastępczy (w formacie zewnętrznym lub przez ponowne uruchomienie) podczas kodowania do oktetów.
- Konwersja z oktetów przy użyciu zewnętrznych formatów UCS-2, UCS-4 i UTF-32 już nie odczytuje końca tablicy oktetów z niecałą liczbą dwu- lub czterobajtowych jednostek.
- Konwersja z oktetów przy użyciu zewnętrznych formatów UCS-2, UCS-4 i UTF-32 teraz zwraca prosty ciąg, jak wymaga definicja typu OCTETS-TO-STRING.
- Stosowanie niewłaściwego zewnętrznego formatu argumentu dla OPEN lub WITH-OPEN-FILE (lub wewnętrzny MAKE-FD-STREAM) już nie prowadzi do wycieku deskryptora pliku.
- SB-ROTATE-BYTE określa specyfikacje BYTE poza dozwolonym zakresem przed wykonaniem kons dotyczącego bardzo dużych liczb całkowitych do użycia w maskach i przesunięciach.
- Korekta typu wyjściowego podczas kompilacji form SB-ROTATE-BYTE z niena nulowym POSITION w definicji bajtu.
- Korekta kilku błędów assemblera podczas kompilacji MAKE-ARRAY, MAKE-STRING i innych o dużym stałym rozmiarze.
- Korekta wewnętrznego błędu podczas kompilacji (SETF-SBIT) z dużym stałym indeksem.
- Korekta wewnętrznego błędu kompilatora dla funkcji lambda z niepoprawną listą parametrów w LABELS.
- Korekta wewnętrznego błędu kompilatora podczas kompilowania niektórych nieskończono-rekurencyjnych form LABELS.
- Korekta wewnętrznego błędu kompilatora podczas próby wbudowania przejścia do już usuniętej etykiety.
- FILL-POINTER nigdy nie powinien być ujemny.
Źródło: opennet.ru
