#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
).