改变
(a b c d (1 2 |3 4) ha ha ha)
到
|(1 2 (a b c d 3 4 ha ha ha))
这种转变有什么用?
答案 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-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较常见的绑定来对if
进行倒钩,转置和/或杀死多余的形式。为了简洁起见,我们还可以将两种if
形式拼接在一起。