Разъяснение о функции Alexandria:длина=

#macros #common-lisp #sequence #compiler-optimization

#макросы #common-lisp #последовательность #оптимизация компилятора

Вопрос:

Руководство Alexandria включает логическую функцию для проверки длины последовательностей:

Функция: length= amp;rest последовательности
принимает любое количество последовательностей или целых чисел в любом порядке. Возвращает true, если длина всех последовательностей и целых чисел равна. Подсказка: есть макрос компилятора, который расширяется до более эффективного кода, если первый аргумент является буквальным целым числом.

В первом предложении говорится о «целых числах» (множественное число). Это просто для проверки того, совпадают ли несколько вычисленных целых чисел одновременно с проверкой длины последовательности? Или есть какое-то более глубокое значение?

Третье предложение предлагает оптимизацию. Означает ли это, что подсчет по списку прекратится при достижении буквального индекса, что делает его потенциально более эффективным, чем (= (длина lst) 3), если lst длинный?

Ответ №1:

В первом предложении говорится о «целых числах» (множественное число). Это просто для проверки того, совпадают ли несколько вычисленных целых чисел одновременно с проверкой длины последовательности? Или есть какое-то более глубокое значение?

Более глубокого значения нет. Вероятно, это просто для симметрии. В принципе, (length= ...) только с целочисленными аргументами это просто медленнее = . Но основным вариантом использования для этого является (length= 3 (some-list)) , т.Е. Проверка, имеет ли некоторая последовательность определенную длину («имеет ли значение последовательности (some-list) длину 3?»).

Третье предложение предлагает оптимизацию. Означает ли это, что подсчет по списку прекратится при достижении буквального индекса, что делает его потенциально более эффективным, чем (= (length lst) 3) если lst бы он был длинным?

Да, это на самом деле так; макрос компилятора расширяется до вызова, для sequence-of-length-p которого (для списков) выполняется что-то похожее на это (через nthcdr ).