它改变了
(a b c d (1 2 |3 4) ha ha ha)
到
|(1 2 (a b c d 3 4 ha ha ha))
这种转换有什么用?
同样只是关于实际使用的快速补充,您可能想查看本教程的第 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))))
干杯!安德烈斯
严格来说,它用于反转内部表达式的嵌套。
举个例子:
(let [foo bar] (if a b| c))
成为
(if a b (let [foo bar]| c))
至于用例,我从来没有专门使用它的实际用途,但它对于更大的宏来说是一个很好的构建块
添加到Nirk的答案中
对于智能用户,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))
对于那些两者都不使用的人,如果您包括
(require 'paredit)
(require 'smartparens)
在 init 文件中,仅这两行并不能将 Emacs 设置为使用 paredit 模式或 smartparens 模式,因此一切都很好。如果您从软件包归档安装包,自动加载文件可能会也可能不会将 Emacs 设置为使用 paredit 模式,并且 paredit 没有自定义界面。如果您安装了 smartparens 软件包,无论自动加载文件做什么,您都可以使用自定义界面将 smartparens-global-mode 设置为 nil,如果它的默认值不是 nil(尽管目前默认为 nil(。
大多数示例都显示了缩小范围,但如果您意识到if
中有一个let
窗体,并且意识到您也需要在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-fat
和M-?
之后(然后再次用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绑定来barf,转置和/或杀死if
中的额外形式,这取决于我们对健康饮食的意图有多真诚。 为了简洁起见,我们还可以将两种if
形式拼接在一起。