Emacs Lisp中的lexical binding lambda是什么?

3
我开始编写这段代码片段是为了实现 "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 " " "-" "+"))))

它按照我的意愿工作,只是“lexical-let”在中间部分的丑陋让我感到困扰。我必须添加它,因为嵌套的lambda函数无法看到变量“k”。是否有更好的编写此代码的方法?我希望有一个神奇的'lexic-lambda'函数,可以让我编写:

(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 " " "-" "+")))
1个回答

3
(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 " " "-" "+"))

另外,自从 Emacs 24 开始,您可以在本地启用词法绑定。只需在文件顶部添加 ;; -*- lexical-binding: t -*-,您的代码就可以在不使用 lexical-let 封装器的情况下正常工作。(请参见 C-h i g (elisp)Lexical Binding RETC-h i g (elisp)Using Lexical Binding RET。)


谢谢,@danlei。我尝试使用相同的方法,但是我把反引号放错了位置,所以它没有起作用。 - abo-abo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接