Разница между символом и именем переменной в 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 как макрос, у вас не будет этого ограничения.

Другие вопросы по тегам