paredit-convolute-sexp在paredit模式下的用途是什么?

时间:2013-08-12 16:25:05

标签: elisp paredit

改变

(a b c d (1 2 |3 4) ha ha ha)

|(1 2 (a b c d 3 4 ha ha ha))

这种转变有什么用?

4 个答案:

答案 0 :(得分:12)

另外,关于实际使用的快速补充,您可以查看本教程的1:40分钟: http://emacsrocks.com/e14.html

打电话给M-?将光标放在do-something的开头,从而扩大了let的范围:

(defun my-other-command ()
  (when (and (this-predicate)
             (that-predicate))
    (let ((v (calculate-v))
          (x (calculate-x)))
      (do-something)
      (do-some-more)
      (do-a-third-thing))))

直接到此:

(defun my-other-command ()
  (let ((v (calculate-v))
        (x (calculate-x)))
    (when (and (this-predicate)
               (that-predicate))
      (do-something)
      (do-some-more)
      (do-a-third-thing))))

喝彩! 安德烈

答案 1 :(得分:6)

严格来说,它用于反转内部表达式的嵌套。

举个例子:

(let [foo bar] (if a b| c))

变为

(if a b (let [foo bar]| c))

至于用例,我从来没有专门用它,但它是一个很好的构建块,用于更大的宏

答案 2 :(得分:1)

添加Nirk的回答

对于smartparens用户,M-x sp-prefix-save-excursion M-x sp-convolute-sexp更改

(let [foo bar] (if a b| c))

(let [foo bar] (if a b |c))

(if a b (let [foo bar] |c))

对于paredit用户,M-x paredit-convolute-sexp更改

(let [foo bar] (if a b| c))

(let [foo bar] (if a b |c))

|(if a b(let [foo bar]  c))

|(if a b (let [foo bar] c))

对于那些不使用它们的人,如果包含

,仍然可以使用convolute命令
(require 'paredit)
(require 'smartparens)

在init文件中并且仅仅这两行不会将您的Emacs设置为使用paredit模式或smartparens模式,所以一切都很好。如果从软件包存档中安装paredit软件包,则自动加载文件可能会也可能不会将Emacs设置为使用paredit模式,而paredit没有自定义接口。如果你安装了smartparens软件包,无论autoloads文件做什么,你都可以使用Customize接口将smartparens-global-mode设置为nil,如果它的默认值不是nil(现在默认为nil)。

答案 3 :(得分:0)

大多数示例的范围都在缩小,但是如果您意识到自己在let中有一个if表单并且意识到您需要在另一个分支中使用这些绑定,那么我很可能会使用此方法if表单。

假设您是一个巨魔,并且您已经找到了一个看起来不错的小偷。

(defn eat-hobbit [hobbit]
  (if (is-cooked? hobbit)
    (eat! hobbit)
    (let [is-fat (< too-greasy (:fat-content hobbit))]
      (if is-fat
        (eat! (deep-fry hobbit))
        (eat! (saute hobbit))))))

您意识到自己可能应该做出更好的健康选择,而不仅仅是吃掉遇到的每个霍比特人,无论是否煮熟,因此您决定首先根据脂肪的含量决定是否食用霍比特人。您必须先知道is-fat,然后才能决定吃饭!因此,您想提升let。将光标放在(let [is-fat ...]M-?中的绑定矢量之后(并使用M-j M-q清除空白):

(defn eat-hobbit [hobbit]
  (let [is-fat (< too-greasy (:fat-content hobbit))]
    (if (is-cooked? hobbit)
      (eat! hobbit)
      (if is-fat
        (eat! (deep-fry hobbit))
        (eat! (saute hobbit))))))

您还没有做出更好的食物选择,但是现在绑定在正确的范围内,可以做出更好的决定。

让我们再试一次。我们真的应该问霍比特人是否先发胖,因此将光标放在(if is-fatM-?之后(并再次使用M-j M-q进行清理):

(defn eat-hobbit [hobbit]
  (let [is-fat (< too-greasy (:fat-content hobbit))]
    (if is-fat
      (if (is-cooked? hobbit)
        (eat! hobbit)

        (eat! (deep-fry hobbit))
        (eat! (saute hobbit))))))

嗯。这还不是很有效-if中有一个额外的形式-但它与我们想要的位置非常接近。此时,根据我们对健康饮食的真诚程度,我们可以轻松地使用paredit较常见的绑定来对if进行倒钩,转置和/或杀死多余的形式。为了简洁起见,我们还可以将两种if形式拼接在一起。