Emacs lisp lambda与词法绑定? [英] Emacs lisp lambda with lexical binding?
问题描述
我开始为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屋!