Emacs lisp lambda与词法绑定? [英] Emacs lisp lambda with lexical binding?

查看:236
本文介绍了Emacs lisp lambda与词法绑定?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我开始为git add -p编写这段代码片段:

 (add-hook 
'diff-mode-hook
(lambda()
(mapc(lambda(k)
(lexical-let((kk k))
(define-key diff-模式映射k
(lambda()(交互式)
(if(region-active-p)
(replace-regexp^。kk
nil
(region-beginning)
(region-end))
(insert kk))))))(list - +)))

它符合我的要求,它只是'词汇的丑陋 - 在中间让我困扰。
我不得不添加它,因为嵌套的lambda没有看到变量'k。
有没有更好的方法来编写这段代码?我更喜欢一些神奇的函数
'lexic-lambda,它可以让我写出:

$ p $ (add-hook
'diff-mode-hook
(lambda()
(mapc(词法 - lambda(k)
(定义键diff-mode-map k
(词法-lambda()(交互式)
(if(region-active-p)
(replace-regexp^。k
nil
(region-beginning)
(region-end))
(insert k)))))(list - +)))


解决方案

 (mapc(lambda(k)
(define-key diff-mode-地图k
`(lambda()
(交互式)
(if(region-active-p)
(replace-regexp^。,k
nil
(区域开始)
(区域结束))
(insert,k)))))
(list - +))

或者,由于Emacs 24,您可以在本地启用词汇绑定。只需添加 ;; - * - 词法绑定:t - * - 位于文件的顶部,并且您的代码应该在没有 lexical-let 包装器的情况下工作。 (请参阅 Ch ig(elisp)词法绑定RET Chig(elisp)使用词法绑定RET 。)


I set out to write this code snippet for "git add -p":

(add-hook
 'diff-mode-hook
 (lambda()            
   (mapc (lambda(k)
           (lexical-let ((kk k))
             (define-key diff-mode-map k
               (lambda()(interactive)
                 (if (region-active-p)
                     (replace-regexp "^." kk
                                     nil
                                     (region-beginning)
                                     (region-end))
                   (insert kk)))))) (list " " "-" "+"))))

It works as I want, it's just the ugliness of 'lexical-let in the middle that bothers me. I had to add it, since the nested lambda didn't see the variable 'k. Is there a better way to write this code? I would prefer some magic function 'lexic-lambda that would allow me to write:

(add-hook
 'diff-mode-hook
 (lambda()            
   (mapc (lexical-lambda(k)
                   (define-key diff-mode-map k
                     (lexical-lambda()(interactive)
                       (if (region-active-p)
                           (replace-regexp "^." k
                                           nil
                                           (region-beginning)
                                           (region-end))
                         (insert k)))))) (list " " "-" "+")))

解决方案

(mapc (lambda (k)
        (define-key diff-mode-map k
          `(lambda ()
             (interactive)
             (if (region-active-p)
                 (replace-regexp "^." ,k
                                 nil
                                 (region-beginning)
                                 (region-end))
               (insert ,k)))))
      (list " " "-" "+"))

Alternatively, since Emacs 24, you can enable lexical bindings locally. Just add ;; -*- lexical-binding: t -*- at the top of the file, and your code should work without the lexical-let wrapper. (See C-h i g (elisp)Lexical Binding RET and C-h i g (elisp)Using Lexical Binding RET.)

这篇关于Emacs lisp lambda与词法绑定?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆