我目前有以下内容:
(defun my-hide-code ()
(interactive)
(set-selective-display 2))
(defvar my-keys-minor-mode-map (make-keymap) "my-keys-minor-mode keymap.")
(define-key my-keys-minor-mode-map (kbd "<f2>") 'my-hide-code)
(define-minor-mode my-keys-minor-mode
"use"
t " my-keys" 'my-keys-minor-mode-map)
(my-keys-minor-mode 1) 现在,我想在(set-selective display 2)和(set-selective-display 'nil)之间切换。
现在,如果我在scheme中,我只需要创建一个s闭包,这个闭包将存储一个状态变量,这将允许我知道我处于哪个状态,以及如何切换。
然而,Elisp显然是一种lisp-2,其中变量和函数具有不同的作用域。考虑到这一点,我如何创建闭包/成为切换键?
发布于 2012-04-16 11:24:57
selective-display本身是包含您需要检查的状态的变量,因此您可以编写
(defun my-toggle-selective-display ()
(interactive)
(if selective-display
(set-selective-display nil)
(set-selective-display 2)))至于一般的闭包,我在很久以前的一个项目中就需要它们,并求助于使用反引号替换将未引用的符号插入到函数定义中,以避免全局变量。例如。
(fset 'toggler
(let ((toggle-var (make-symbol "toggle")))
(set toggle-var nil)
`(lambda () (interactive)
(cond (,toggle-var
(setq ,toggle-var nil))
(t
(setq ,toggle-var t)))
(message "toggle is %s" ,toggle-var))))它在运行时生成
M-x toggler
toggle is t
M-x toggler
toggle is nil
M-x toggler
toggle is t
M-: (boundp 'toggle)
nil我想这可以说是一种乱七八糟的东西,但我不知道还有其他方法可以在Emacs-Lisp中获得类似于闭包的东西。
发布于 2012-04-16 14:10:43
Emacs 24支持词法绑定,因此可以编写真正的闭包。
请参阅:What are the new rules for variable scoping in Emacs 24?
请注意,动态绑定是使Emacs如此可定制的很大一部分原因,因此,如果您正在编写可能对其他人有用的东西,请谨慎使用词汇绑定--确保defvar任何可能对某人有用的变量(当然,确保您考虑了所有那些不适用于您的潜在用例!)
对于Emacs < 24,请参阅:
发布于 2012-12-30 12:01:44
下面是我在其他地方给出的关于如何在Elisp中创建真正(而不是假的)闭包的答案的链接:
https://stackoverflow.com/a/14088107/1857114
我使用一个名为defun的宏*。它在Emacs 24.2.1中工作,但我不确定它在哪个早期版本上工作。据推测,**defun特殊表单将在未来的某个时候升级,宏将不再是必要的。
https://stackoverflow.com/questions/10168261
复制相似问题