Я обнаружил, что различные пакеты в их инструкциях по установке используют push или add-to-list (например, добавление каталога в путь загрузки), и мне было интересно, в чем разница и каков вариант использования для каждого из них.
28
add-to-list
в код, используяcl-pushnew
, и я нашел это сообщение в блоге весьма поразительным: yoo2080.wordpress.com/2013/09/11/…Ответы:
То, что упоминает #zck, является одним отличием. Но если бы это было единственным отличием, тогда вы могли бы спросить об
cl-pushnew
иadd-to-list
.Еще одно важное отличие:
add-to-list
это функция, которая означает, что она оценивает все свои аргументы, в частности, первый.push
является макросом (как естьcl-pushnew
) - он не оценивает свой второй аргумент; вместо этого это интерпретирует это как обобщенное место.Например, если второй аргумент является символом, то он рассматривается как переменная, и значение первого аргумента ограничивается значением этого символа как переменная, и для переменной устанавливаются эти новые минусы.
Как
add-to-list
сказано в строке документа :источник
add-to-list can't use lexical var ...; use push or cl-pushnew
(push (5 6) my-list)
все равно выдает ошибку -5
это не функция. Чем это отличается от нашегоadd-to-list
поведения?(5 6)
на место (значение переменной),my-list
то вам нужно создать список(5 6)
. Один из способов сделать это - использовать'(5 6)
; другой должен использовать(list 5 6)
.push
оценивает аргумент.push
- это место, например, переменная. Первый аргумент вычисляется, ограничивается значением этой переменной, и для переменной устанавливаются эти новые минусы.add-to-list
вычисляет свой первый аргумент для получения переменной, значение которой обновляется.push
не оценивает свой второй аргумент, который является переменной для обновления. Порядок arg обратный между двумя.Из документации Emacs или
C-h f push
:С той же страницы, или
C-h f add-to-list
:Так что
add-to-list
только толкает, если элемент еще не там.источник
cl-pushnew
ведет себя какadd-to-list
.Еще одно отличие:
push
добавляет элемент в начало списка .add-to-list
позволяет добавить элемент в начало или конец списка .источник