что-то сбивает с толку в ключе определения (и в вопросе, когда цитировать аргумент)

StackOverflow https://stackoverflow.com/questions/1636336

  •  06-07-2019
  •  | 
  •  

Вопрос

Кажется, при использовании ключа определения не следует указывать KEYMAP в кавычки.

(define-key org-remember-mode-map "\C-c\C-r" 'org-remember-kill)

Я в замешательстве, потому что думаю, что оцениваются все аргументы функции, не заключенной в кавычки, и, согласно справке, define-key - это функция, а не макрос.Я не понимаю, почему значение KEYMAP можно изменить после вызова define-key.

(defun increment-value (a)
  (setq a (+ 1 a)))

(setq my-num 10)

(increment-value my-num)

my-num ; ===> 10

Обновлять:Ответы объясняют все, но для тех, кто все еще в замешательстве, позвольте мне прояснить ситуацию, приведя дополнительные примеры.

Мой пример приращения значения выше эквивалентен этому:

(let ((n 0))
  (print n) ; prints 0
  (let ((a n))
    (setq a (+ 1 a))
    (print a) ; prints 1
    )
  (print n) ; prints 0
  )

Я думаю, что происходящее выше похоже на то, что происходит в этом примере с некоторой картой:

(let ((some-map '(1 2)))
  (print some-map) ; prints (1 2)
  (let ((a some-map))
    (setq a (list 4 (second a)))
    (print a) ; prints (4 2)
    )
  (print some-map) ; prints (1 2)
  )

То, что происходит в define-key, похоже на второй пример some-map:

(let ((some-map '(1 2)))
  (print some-map) ; prints (1 2)
  (let ((a some-map))
    (setcar a 4)
    (print a) ; prints (4 2)
    )
  (print some-map) ; prints (4 2)
  )

Теперь прочитайте ответы еще раз, помня эти три примера, и вы поймете.Читайте также http://www.emacswiki.org/emacs/ListModification

Это было полезно?

Решение

Вы на самом деле не изменяете, что такое 'org-Remember-Map (указатель на определенную структуру списка), вы изменяете фактическую структуру. Прочитайте эту информационную страницу для получения подробной информации об изменении списки.

В частности, если вы посмотрите документацию по 'make-keymap :

  

(make-keymap & amp; необязательная строка)

     

Создайте и верните новую раскладку из   форма (таблица ключей CHARTABLE. ALIST).   CHARTABLE - таблица символов, которая содержит   привязки для всех персонажей   без модификаторов. Все записи в нем   изначально равны нулю, что означает "команда"   не определено & Quot ;. ALIST является ассоциативным списком   который содержит привязки для функции   ключи, события мыши и любые другие   вещи, которые появляются на входе   поток. Изначально ALIST равен нулю.

Вы увидите, что раскладка ключей представляет собой список из трех элементов. Позвольте мне нарисовать это для вас (ура M-x Artist-Mode ):

 org-remember-map
    |
    |
    v
 +----+----+    +----+----+
 | |  |  --+--->+  / | \  |
 +-+--+----+    +-/--+--\-+
   |              |     |
   v              v     v
keymap      CHARTABLE  ALIST

Итак, значение 'org-Remember-Map похоже на приведенную выше структуру, и когда вы определяете ключ, вы делаете то, на что вы указываете в ALIST часть структуры BLOB-объекта.

Другие советы

вы путаете значение и сопоставление имени и значения.

в вашей функции приращения значения вы не меняете aзначение так же, как и изменение отображения имени a к новому значению.

По сути, изменить значение 10 невозможно.10 это 10!

Но в первом случае вы можете либо изменить отображение имени org-remember-mode-map на совершенно другую карту (установите новое значение), или вы можете изменить карта, на которую указывает это имя (ее текущее значение).Это то, что делает ключ определения.

Иллюстрация:

(setq a '(1 2)) -> (1 2)
(setcar a 4) -> 4
a -> (4 2)

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

Все подробности в минусах. Тип ячейки в разделе руководства elisp.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top