小编Ced*_*tin的帖子

两个嵌套的for和map?

当我需要生成一个需要"两个循环"的序列时,最好是这样做:

(for [x (range 1 4)] (map #(* x %) (range 6 9)))
Run Code Online (Sandbox Code Playgroud)

或类似的东西:

(for [x (range 1 4)] (for [y (range 6 9)] (* x y)))
Run Code Online (Sandbox Code Playgroud)

两者都给出相同的结果:

((6 7 8) (12 14 16) (18 21 24))
Run Code Online (Sandbox Code Playgroud)

比另一个更惯用,这两者之间有什么区别?

此外,是否可以通过嵌套两个地图获得相同的结果?

for-loop idiomatic clojure map

4
推荐指数
1
解决办法
1827
查看次数

函数重载了不同数量的参数

很多Clojure函数接受了不同数量的参数,我常常对文档以及它与我应该使用函数的方式有什么关系.

例如,(doc partial)返回:

([f arg1] [f arg1 arg2] [f arg1 arg2 arg3] [f arg1 arg2 arg3 & more])
Run Code Online (Sandbox Code Playgroud)

我的问题不是关于部分的,而是......

为什么arg1 arg2 arg3及更多而不是arg1及更多arg1 arg2及更多arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8及更多

我在开玩笑随着最后一个,但是这是一个很现实的问题:是什么因素决定"argX"有多少人需要前放及更多

arguments function clojure

4
推荐指数
1
解决办法
1991
查看次数

精炼key-chord.el触发

真的很喜欢,key-chord.el但我只需要短暂的延迟开始按键击键时触发它,在此期间我没有做任何事情.我想知道修改它是否容易key-chord.el.

为什么我希望这很简单,我会尽可能轻松地解释它:

  • 我确实希望将键盘分配给我的"强"手指(没有小指)并且在我的主行(我做触摸式)上的键.因此,当我打字时,我可能会创建一些可能与常用单词/代码冲突的键盘.

  • 我意识到每次发生碰撞时(即键盘都在我不想要的时候踢),这是因为我正在疯狂地修改缓冲区.

这是一个例子......

我是一个快速打字员,所以如果我进入,比如说,"持有",那么在我添加"持有"的"e"和我输入"l"之间永远不会有很长的延迟.所以在这种情况下,当我输入'ld'时,我不希望键和弦开始,这应该是"显而易见的".但是,如果有一个停顿和如果 "LD"是分配的主和弦,然后我打"LD",那么它是非常不可能的,我写的代码/将与"LD"首发文本.所以在后面这种情况下(因为我已经将'ld'分配给了一个键和弦),我确实希望它能够进入.

现在不要误会我的意思:我不是说这会消除每一个案件中可能发生的每一次冲突.我所说的就是,就我而言,这可能会消除99.9%的(已经罕见的)冲突."时间丢失"应该发生一次冲突仍然发生在键和弦的变化与键和弦使我获得的时间量相比可以忽略不计.

代码key-chord.el非常小所以也许这样的添加不会太难?

有没有人知道如何修改key-chord.el以提供这样的功能?(我希望我能正确解释我想做什么)

这是key-chord.el的代码,其中一半是注释:

http://emacswiki.org/emacs/key-chord.el

emacs elisp keyboard-shortcuts

4
推荐指数
1
解决办法
608
查看次数

当需要输入时更改迷你缓冲区的背景颜色

当迷你缓冲区预期用户活动时,是否可以更改其背景颜色?例如,当函数需要参数或函数名称不完整时,或者当您开始输入“Cx”并且需要更多键时等。

我正在考虑这样的事情:http://emacswiki.org/emacs/Dedicated_Minibuffer_Frame(请参阅“Minibuffer背景颜色指示用户活动”,有很多屏幕截图)

除了以上仅当迷你缓冲区位于其自己的帧中时才有效。

我希望当迷你缓冲区是“常规”迷你缓冲区且其他缓冲区位于同一帧中时它可以工作。

我的 elisp 还不够强大,无法自己解决这个问题,所以非常欢迎任何意见。

编辑

我可以执行以下操作来更改整个缓冲区的背景:

(add-hook 'minibuffer-setup-hook 
  (function (lambda ()
              (set-background-color "black"))))
Run Code Online (Sandbox Code Playgroud)

我不知道使用一些“hack”来更改迷你缓冲区的背景是否很容易。

我也不知道如何变回以前的颜色。我不确定执行此操作的正确方法是什么。

如果我不能只更改迷你缓冲区的背景,那么更改整个背景就可以了。

emacs background-color minibuffer

4
推荐指数
1
解决办法
2169
查看次数

编译后,一个程序可以假设运行而无需调用eval吗?

我正在学习Clojure是如何工作的,我想知道是否有可能(只是为了理解Clojure和Lisps方言一般如何工作)来编译Clojure程序然后运行它"禁止"使用eval.

请注意,我不会问,在技术上是否可能,例如,hotpatch正在运行的Clojure程序,以便一旦编译了Clojure程序,就会抛出异常,如果eval被调用的话.

我要问的是,如果技术上可以禁止使用eval,那么大多数Clojure程序不使用REPL而不是特定的eval仍然可以工作吗?

或者是在运行时使用eval的默认/内置API /宏/函数?

lisp macros eval clojure

4
推荐指数
1
解决办法
184
查看次数

未捕获的异常如何在线程中表现?

我试图了解一个程序正在发生什么,我有异常"消失"而没有任何通知(并且一个线程停止工作).

我能想出的最简单的问题是重现这个问题:

(defn -main []
  (let [a (future (do (println "Ouch... ") 
                      (/ 0 0)
                      (println "We never arrive here")))]
      (Thread/sleep 1000)
      (println "Hmmmm" @a)))
Run Code Online (Sandbox Code Playgroud)

当然,当在repl(或使用lein run)运行时,我得到一个例外:

so.core> (-main)
Ouch... 
ArithmeticException Divide by zero  clojure.lang.Numbers.divide (Numbers.java:156)
Run Code Online (Sandbox Code Playgroud)

这是我期望的行为.

但是现在如果我删除未来的解除引用:

(defn -main []
  (let [a (future (do (println "Ouch... ") 
                      (/ 0 0)
                      (println "We never arrive here")))]
      (Thread/sleep 1000)
      (println "Hmmmm")))
Run Code Online (Sandbox Code Playgroud)

这是输出:

so.core> (-main)
Ouch... 
Hmmmm
nil
so.core> 
Run Code Online (Sandbox Code Playgroud)

因此未来将被执行(否则"哎哟..."将不会被打印)显然会抛出异常(否则"我们永远不会到达这里"会打印)......但是这个例外无处可寻找程序继续,好像一切都很好.

显然,只要我不尝试取消引用未来,线程就可以在其工作中间(在这种情况下打印到stdout)静默地死亡,并且无处可寻找异常.

这是正常的吗?

我应该在我的一个Emacs/cider缓冲区中找到该异常的(堆栈)跟踪吗?

什么是让未来做其工作的惯用方法(例如,从队列中消费消息)并在出现问题时"警告"我?

我应该在try/catch块中包装每个未来的调用吗?

我应该设置默认的未捕获异常处理程序吗?

我不应该使用未来运行"不停止"的线程吗?

基本上,我是在Java/Clojure的,这里的行为很迷茫,想有两种解释, …

exception-handling future exception clojure

4
推荐指数
1
解决办法
184
查看次数

是:参考和:同时使用?

当我阅读Clojure代码(比如来自GitHub上的各种项目时)时,我有一些不太了解的东西:在:require表达式中,:as当你只使用你所指的函数时,你应该使用它:refer吗?此外,我不太确定Clojure和ClojureScript之间是否存在任何差异,也不存在任何约定.

例如(我正在使用猫库作为示例,但这只是一个示例)如果我这样做:

(ns example.core
  (:require
     [cats.core]
     [cats.monad.maybe :as maybe]))
Run Code Online (Sandbox Code Playgroud)

从REPL我可以这样做:

REPL> (cats.core/mappend (maybe/just 1))
Run Code Online (Sandbox Code Playgroud)

但它不是很方便,所以我可以这样做:

(ns example.core
  (:require
     [cats.core :as m]
     [cats.monad.maybe :as maybe]))

REPL> (m/mappend (maybe/just 1))
Run Code Online (Sandbox Code Playgroud)

现在,如果我一直使用mappend(和其他几个),我可以这样做:

(ns example.core
  (:require
     [cats.core :refer [mappend]]
     [cats.monad.maybe :as maybe]))

REPL> (mappend (maybe/just 1))
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:是否有在同时使用任何用途:as:refer,就像下面的例子吗?

(ns example.core
  (:require
     [cats.core :as m :refer [mappend]] ; does this make any sense?
     [cats.monad.maybe :as maybe]))
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用,也就是说,mappend所有的时间和可能想直接把它称为mappend,但bind不是经常使用:refer …

alias namespaces clojure clojurescript

4
推荐指数
1
解决办法
74
查看次数

根据自定义比较器排序

我有一张看起来像这样的地图:

user> (frequencies "aaabccddddee")
{\a 3, \b 1, \c 2, \d 4, \e 2}
Run Code Online (Sandbox Code Playgroud)

而且我希望有一个函数可以根据每个字符出现在我作为参数传递的字符串中的顺序对键/值对进行排序.

像这样的东西:

user> (somesort "defgcab" (frequencies "aaabccddddee"))
[[\d 4] [\e 2] [\c 2] [\a 3] [\b 1]]
Run Code Online (Sandbox Code Playgroud)

(在上面的示例中,'f'和'g'没有出现在地图中,因此它们被忽略.保证字符串 - 本例中的"defgcab" - 应该包含地图中的每个字符/键)

只要对它进行排序,结果集合就没那么重要了.

我尝试了几件事,但找不到办法使这项工作.

sorting vector clojure map

3
推荐指数
1
解决办法
168
查看次数

替代版本的交换!还返回换出的值

我今天在IRC的#clojure频道上讨论过这个问题,但是我想在这里详细介绍一下.基本上,为了更好地理解原子swap!,deref和Clojure的并发作为一个整体,我想尝试写一个函数,它不仅返回被交换,在使用的价值swap!,也表明了换出的值.

(def foo (atom 42))

.
.
.

((fn [a]
  (do
    (println "swapped out: " @a)
    (println "swapped in: "(swap! a rand-int)))) foo)
Run Code Online (Sandbox Code Playgroud)

可以打印:

swapped out:  42
swapped in:   14
Run Code Online (Sandbox Code Playgroud)

但是,如果另一个线程swap!@a deref和调用之间执行相同的原子,swap!那么我可能会交换一个不是42的值.

如何编写一个能正确回放两个值(交换掉和交换掉)的函数?

我并不关心原子确实改变的各种值:我想知道的是所交换的值是多少.

这可以使用保证不会死锁的代码编写,如果是这样,为什么?

concurrency multithreading atomic clojure

3
推荐指数
2
解决办法
500
查看次数

如何让rlwrap在Emacs的shell/eshell中工作?

当我尝试rlwrap在Emacs(版本24.3.50.1)shell缓冲区(M-x shell或者M-x eshell)中工作时,我收到以下错误消息:

rlwrap:糟糕,崩溃(抓住SIGFPE) - 这不应该发生!

例如:

 rlwrap telnet google.com 80
Run Code Online (Sandbox Code Playgroud)

从常规终端(如xterm)恶化,但从Emacs缓冲区内的shell崩溃.

有几个人有类似的问题,但到目前为止,我能找到的唯一"答案"是邮件列表上的"RTFM"风格答案.我确实阅读了Emacs文档的那部分,我不明白我应该做什么来rlwrap从Emacs内部开展工作.

emacs shell eshell rlwrap

3
推荐指数
1
解决办法
522
查看次数