在Common Lisp中你可以这样做:
(defun foo (bar &key baz quux)
(list bar baz quux))
(foo 1 :quux 3 :baz 2) ; => (1 2 3)
Run Code Online (Sandbox Code Playgroud)
Clojure没有关键字参数.一种选择是:
(defn foo [bar {:keys [baz quux]}]
(list bar baz quux))
(foo 1 {:quux 3 :baz 2}) ; => (1 2 3)
Run Code Online (Sandbox Code Playgroud)
这是太多的嵌套括号,必须一直打字和阅读.它还需要将显式散列映射作为参数而不是平面列表传递.
什么是最惯用的Clojure相当于关键字参数,看起来没有人引发标点炸弹?
在Python中,我刚刚读了一个文本文件的行,我想知道如何编写代码来忽略带有#行开头的#的注释.
我认为它应该是这样的:
for
if line !contain #
then ...process line
else end for loop
Run Code Online (Sandbox Code Playgroud)
但我是Python的新手,我不知道语法
我有一些非常大的分隔数据文件,我想只处理R中的某些列而不花时间和内存来创建data.frame整个文件.
我所知道的唯一选择是read.table,当我只想要几列或者scan看起来我想要的水平太低时非常浪费.
有没有更好的选择,无论是使用纯R还是调用其他shell脚本来进行列提取,然后在其输出上使用scan或read.table?(这导致了如何调用shell脚本并在R中捕获其输出的问题).
作为一个非暴力者,我应该如何最好地理解vars得名的命名约定*var-name*?
这似乎是一个表示全局变量的lisp约定.但是在clojure中,据我所知,这些变量出现在命名空间中.
我真的很感谢作者在他们的代码中使用这些变量时我应该期待的一个简短的解释,理想的例子是如何以及为什么在clojure库中使用和更改这样的var.
我应该如何监控clojure中映射函数的进度?
当用命令语言处理记录时,我经常每隔一段时间打印一条消息,以指示事情已经走了多远,例如报告每1000条记录.基本上这是计算循环重复.
我想知道在clojure中我可以采取什么方法,我将一个函数映射到我的记录序列.在这种情况下,打印消息(甚至保持进度计数)似乎基本上是副作用.
到目前为止我想出的是:
(defn report
[report-every val cnt]
(if (= 0 (mod cnt report-every))
(println "Done" cnt))
val)
(defn report-progress
[report-every aseq]
(map (fn [val cnt]
(report report-every val cnt))
aseq
(iterate inc 1)))
Run Code Online (Sandbox Code Playgroud)
例如:
user> (doall (report-progress 2 (range 10)))
Done 2
Done 4
Done 6
Done 8
Done 10
(0 1 2 3 4 5 6 7 8 9)
Run Code Online (Sandbox Code Playgroud)
是否有其他(更好)的方法来实现这种效果?
我在做什么有任何陷阱?(我认为我保留了懒惰,而不是举个例子.)
使用clojure我在序列中有非常大量的数据,我想并行处理它,核心数量相对较少(4到8).
最简单的方法是使用pmap而不是将map处理函数映射到数据序列上.但协调开销导致我的案件净亏损.
我认为原因是pmap假设跨数据映射的函数非常昂贵.查看pmap的源代码,它似乎future依次为序列的每个元素构造一个,因此函数的每次调用都发生在一个单独的线程上(在可用内核的数量上循环).
以下是pmap的相关部分:
(defn pmap
"Like map, except f is applied in parallel. Semi-lazy in that the
parallel computation stays ahead of the consumption, but doesn't
realize the entire result unless required. Only useful for
computationally intensive functions where the time of f dominates
the coordination overhead."
([f coll]
(let [n (+ 2 (.. Runtime getRuntime availableProcessors))
rets (map #(future (f %)) coll)
step (fn step [[x & …Run Code Online (Sandbox Code Playgroud) 在另一个问题的接受答案中,在运行时设置Clojure"常量",使用clojure函数constantly.
constantly看起来像这样的定义:
(defn constantly
"Returns a function that takes any number of arguments and returns x."
{:added "1.0"}
[x] (fn [& args] x))
Run Code Online (Sandbox Code Playgroud)
文档字符串说明了它的作用但不是为什么会使用它.
在上一个问题中给出的答案中,常常使用如下:
(declare version)
(defn -main
[& args]
(alter-var-root #'version (constantly (-> ...)))
(do-stuff))
Run Code Online (Sandbox Code Playgroud)
因此,不断返回的函数直接评估其结果.我很困惑这是如何有用的.我可能不理解如何x在"不断"包装中进行评估.
我什么时候应该使用constantly,为什么有必要?
所以我已经定义了一些vars来保存我的clojure代码中的状态数据.我刚刚发现我可以为这些变量添加文档字符串,例如:
(def ^{:doc "Documentation for *my-var*"}
*my-var*)
Run Code Online (Sandbox Code Playgroud)
那让我打电话(doc *my-var*)给REPL.这似乎是一个有效且有用的事情,但它似乎并不像我读过的(有限的)代码中的常见做法.
这被认为是惯用语吗?
我想改进java应用程序的跨平台行为.但是,它的测试套件目前假定存在该/tmp目录.
Windows平台上最好的等效位置是什么?NB我绝对不想假设用户拥有管理员权限,但我确实希望它至少可以在XP,Vista和Windows7上运行.
是否存在可以提供帮助的现有环境变量,和/或我可以按优先顺序尝试的一组首选位置?
是否有人知道emacs模式或函数会重新格式化一个包含分隔文件的缓冲区,以便每个分隔符(例如制表符)定义一个"列",每列的宽度设置为最长的条目?
我可以重置tab-width变量,但这会使所有列的宽度相等.如果可能的话,我更喜欢可变宽度的列(比如像excel这样的电子表格程序在调整列之后会显示这样的文件).