首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Emacs / Elisp /闭包/切换

Emacs / Elisp /闭包/切换
EN

Stack Overflow用户
提问于 2012-04-16 11:06:23
回答 3查看 382关注 0票数 1

我目前有以下内容:

代码语言:javascript
复制
(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,其中变量和函数具有不同的作用域。考虑到这一点,我如何创建闭包/成为切换键?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-16 11:24:57

selective-display本身是包含您需要检查的状态的变量,因此您可以编写

代码语言:javascript
复制
(defun my-toggle-selective-display ()
  (interactive)
  (if selective-display
      (set-selective-display nil)
    (set-selective-display 2)))

至于一般的闭包,我在很久以前的一个项目中就需要它们,并求助于使用反引号替换将未引用的符号插入到函数定义中,以避免全局变量。例如。

代码语言:javascript
复制
(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))))

它在运行时生成

代码语言:javascript
复制
M-x toggler
toggle is t
M-x toggler
toggle is nil
M-x toggler
toggle is t
M-: (boundp 'toggle)
nil

我想这可以说是一种乱七八糟的东西,但我不知道还有其他方法可以在Emacs-Lisp中获得类似于闭包的东西。

票数 2
EN

Stack Overflow用户

发布于 2012-04-16 14:10:43

Emacs 24支持词法绑定,因此可以编写真正的闭包。

请参阅:What are the new rules for variable scoping in Emacs 24?

请注意,动态绑定是使Emacs如此可定制的很大一部分原因,因此,如果您正在编写可能对其他人有用的东西,请谨慎使用词汇绑定--确保defvar任何可能对某人有用的变量(当然,确保您考虑了所有那些不适用于您的潜在用例!)

对于Emacs < 24,请参阅:

票数 3
EN

Stack Overflow用户

发布于 2012-12-30 12:01:44

下面是我在其他地方给出的关于如何在Elisp中创建真正(而不是假的)闭包的答案的链接:

https://stackoverflow.com/a/14088107/1857114

我使用一个名为defun的宏*。它在Emacs 24.2.1中工作,但我不确定它在哪个早期版本上工作。据推测,**defun特殊表单将在未来的某个时候升级,宏将不再是必要的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10168261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档