Преобразование подписанного слова в целое число в Lisp

Мне нужна помощь в понимании и исправлении примечания компилятора SBCL, в котором говорится:

; in: DEFUN PRINT-SEARCH-PROGRESS-GRAPH
;     (- (1+ WOULDWORK-PKG::*N*)
;        (LENGTH WOULDWORK-PKG::*L*))
;
; note: doing signed word to integer coercion (cost 20), for:
;       the first result of inline (signed-byte 64) arithmetic

Некоторая, возможно, важная справочная информация:

(optimize (debug 3))

(defparameter *N* 0)
(declaim (fixnum *N*))
    
(defparameter *L* nil)
(declaim (list *L*))
    
(type-of *N*) => BIT

Изменить (fixnum *N*) на (integer *N*)

Barmar 14.02.2023 21:17
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
О тренинге HTML JavaScript :HTML (язык гипертекстовой разметки) и CSS (каскадные таблицы стилей) - две основные технологии для создания веб-страниц....
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
Запуск PHP на IIS без использования программы установки веб-платформы
Запуск PHP на IIS без использования программы установки веб-платформы
Установщик веб-платформы, предлагаемый компанией Microsoft, перестанет работать 31 декабря 2022 года. Его закрытие привело к тому, что мы не можем...
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
3
1
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы объявили *N* как FIXNUM, то есть целое число фиксированного размера; это эквивалентно (SIGNED-BYTE 64) в 64-битном SBCL. Но если его значение окажется MOST-POSITIVE-FIXNUM, (1+ *n*) может дать значение, которое не умещается в 64 бита, поэтому его придется преобразовать в INTEGER. Примечание предупреждает вас, что это преобразование может иметь место.

Если вы знаете, что он никогда не будет настолько высоким, чтобы это переполнение было необходимо, вы можете использовать THE:

(- (the fixnum (1+ *n*)) (length *l*))

Что касается первого исправления, переменная *N* должна быть fixnum, потому что я объявляю ее с помощью sb-ext:defglobal, чтобы включить параллельное обновление. Что касается второго исправления с использованием «fixnum», я получаю то же примечание компилятора, что и раньше.

davypough 15.02.2023 00:46

Вероятно, это потому, что у (length *l*) нет причин быть фиксированным числом (следовательно, вычитание, вероятно, должно быть «общим»). Более того, вычитание двух фиксированных чисел все равно может привести к «бигнуму»: — вы можете обернуть каждое выражение в (the fixnum ...) — или объявить (возможно, локально) то, что вы знаете, например. (declare (type (integer 0 42) *N*)) если вы знаете точные границы *N* - в общем, напишите остальную часть программы и профилируйте, чтобы увидеть, имеет ли вообще отношение эта ОДНА операция к производительности.

Numbra 15.02.2023 08:23

Да, похоже, что есть потенциал для превышения самого отрицательного фиксированного номера. Перемещение «fixnum» в начало выражения работает, очевидно, потому, что sbcl может вычислить внутренние выражения. Цените идеи.

davypough 15.02.2023 15:02

@Numbra: на самом деле в 64-битном SBCL (и я уверен, что и в 32-битном) length должен возвращать fixnum, и SBCL знает об этом (длина самого длинного списка — это fixnum, а array-dimension-limit — это fixnum .

ignis volens 20.02.2023 17:41

Другие вопросы по теме