【问题标题】:Emacs lisp lambda with lexical binding?带有词法绑定的 Emacs lisp lambda?
【发布时间】:2013-06-04 12:01:24
【问题描述】:

我开始为“git add -p”编写这段代码sn-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 " " "-" "+")))

【问题讨论】:

    标签: git elisp


    【解决方案1】:
    (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。我尝试使用相同的方法,但我把反引号放在了错误的位置,它没有用。
    猜你喜欢
    • 2018-08-21
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多