Апостроф в autoLISP

Столкнулся с вопросом что же делает апостроф в записях на autoLISP, покопавшись в интернетах нашел это исчерпывающее объяснение. Ну и в меру своих сил постарался перевести его на русский язык:

Введение

Мой опыт показывает, что информации о назначении апострофа в записях на AutoLISP крайне мало, а разъяснения и уроки в которых он есть, если и объясняют его назначение то походя, как нечто само-собой разумеющееся.

Многих начинающих работать с AutoLISP этот символ часто ставит в тупик, когда попадается в коде.
Так же для начинающих далеко не очевидно в каких случаях его следует применять, а в каких напротив имеет смысл воспользоваться другими языковыми средствами.

Поэтому здесь я собрал объяснения и примеры, которые, я надеюсь, сделают понятным назначение и способы применения оператора апостроф и функции quote в языке AutoLISP.

Апостроф

‘ — апостроф или одинарная кавычка — отмечает выражение или символ как буквальное выражение, которое будет принято как есть, без оценки интерпретатором AutoLISP.

quote — может быть любая форма данных AutoLISP, как апостроф обычно используется со списками или символов, так как большинство других форм AutoLISP данных (строки, целых, вещественных) уже буквальные константы и, следовательно, не требуют его использования.

Константы

Выражение содержащее константы или фиксированные значения (значения которые не меняются при выполнении функции) могут быть названы — букальными выражениям, так как над ними нет нужды проводить какие либо вычисления в процессе выполнения функции, и данные в них не меняются, и не зависят от контекста.

Для примера возьмем небольшой список с численными значениями.

_$ (list 1 2 3 4 5)
(1 2 3 4 5)

Список сформирован  с помощью функции list и списка целых чисел в качестве аргументов этой функции. Выполнение функции вернет значение в виде списка чисел в том же порядке в котором они были в виде аргументов функции.

Тем не мение каждый аргумент — это константа, нам нет нужды проводить над ними какие-либо вычисления или преобразования с помощью функции list.  Так как конечный результат будет списком именно с этими значениями.

Такой список можно назвать буквальным, и используя апостров — получить тот же конечный результат:

_$ '(1 2 3 4 5)
(1 2 3 4 5)

Аналогично, рассмотрим операцию построения списка точечных пар:

_$ (list (cons 1 "a") (cons 2 "b") (cons 3 "c"))
((1 . "a") (2 . "b") (3 . "c"))

Здесь элементом списка выступает число и строковое значение, для получения которых мы используем в качестве аргументов элементы которые расчитываются с помощью функции cons. Выполнение функции возвращает список состоящий из пар (число точка строка). Каждая пара вычисляется в процессе выполнения функции и возвращается в виде списка приведенного в примере.

Тем не менее в этом примере мы с данными никаких операций по сути не проводим, и соответственно разумнее в таком случае сформировать список с помощью апострофа:

_$ '((1 . "a") (2 . "b") (3 . "c"))
((1 . "a") (2 . "b") (3 . "c"))

Возьмём для примера что-то более практичное — список пар (число.строка) в качестве аргумента для функции ssget для фильтрации результата выборки.

Результатом выполнения следующего примера будет выборка всех замкнутых полилиний в текущем документе:

(ssget "_X" '((0 . "LWPOLYLINE") (-4 . "&=") (70 . 1)))

Так как фильтр функции содержит только константы, лист фильтрации может быть создан с помощью апострофа.

Дополнительную информацию о функции ssget можно найти тут: ssget Function Reference.

Переменные значения.

Конечно есть пределы применимости апострофа для данных в AutoLISP.

Проиллюстрируем примером:

_$ (setq x 5)
5
_$ (list 1 2 3 4 x)
(1 2 3 4 5)

Здесь, сначала создана переменная x которой назначено численное значение 5;

А потом создан список с помощью функции list для которой в качестве аргументов использованы числа от 1 до 4 и переменная X.

Результатом будет список от одного до пяти.

Аналогичный пример с использованием апострофа, вернёт на первый взгляд не корректный результат:

_$ (setq x 5)
5
_$ '(1 2 3 4 x)
(1 2 3 4 X)

Так как апостроф формирует лист буквально из символов, содержание которых не вычисляется в процессе выполнения AutoLISP интерпритатором, переменная x воспринимается в таком случае буквально как один из символов списка.

Источник