Разница между символом и именем переменной в emacs lisp
Мне интересно, какая разница между
(add-to-list 'flymake-allowed-file-name-masks
'("\\.py\\'" flymake-pylint-init))
а также
(add-to-list flymake-allowed-file-name-masks
'("\\.py\\'" flymake-pylint-init))
Каков четкий смысл апостроф здесь?
1 ответ
Апостроф - это цитата, которая говорит переводчику не анализировать следующее выражение (имя символа). Таким образом, 'add-to-list
получает символ, который содержит значение списка, которое предназначено для оценки.
Чтобы узнать больше о символах, прочитайте документацию по символам (в частности, символы компонентов символов имеют имена, значения, определения функций и списки свойств).
Не читая документацию, я объясняю это следующим образом: стратегия оценки Emacs lisp заключается в передаче по значению (в отличие от имени или ссылки или чего-то еще). Если бы цитаты не было, flymake-allowed-file-name-masks
будет оцениваться до значения, и add-to-list
пришлось бы работать напрямую по списку. Это будет работать, со следующими исключениями. Если бы список был пустым, не было бы никакого способа изменить то, на что указала исходная переменная. По той же причине вы не сможете добавлять элементы в начало списка.
Чтобы эти два случая работали, вам действительно нужно имя переменной, чтобы вы могли изменить то, на что она указывает.
Вероятно, было бы полезно прочитать следующее: Введение в оценку, Изменение переменных списка и Изменение существующих структур списка.
Если вы знакомы с коробочными диаграммами, возможно, это поможет.
Представь это some-var
указывает на список:
somevar
|
|
v
--- --- --- --- --- ---
| | |--> | | |--> | | |--> nil
--- --- --- --- --- ---
| | |
| | |
--> rose --> violet --> buttercup
И вы хотели поместить что-то в начало этого списка.
Если вам нужно работать только со значением указателя в somevar
тогда лучшее, что вы можете сделать, это поместить новый элемент в начало списка, но вы не можете изменить somevar
указывает на (потому что у вас нет somevar
, у вас есть это значение). Вот так:
somevar
|
|
v
--- --- --- --- --- --- --- ---
| | |--> | | |--> | | |--> | | |--> nil
--- --- --- --- --- --- --- ---
| | | |
| | | |
--> tulip --> rose --> violet --> buttercup
Итак, написать свой 'add-to-list
функция, вам нужно имя переменной.
Конечно, если вы написали 'add-to-list
как макрос, у вас не будет этого ограничения.