谁能解释或指出我在哪里可以找到clojure的命名约定:
switch在Clojure中是否有Java的构造的等价物?如果是,那是什么?如果不是,我们是否必须使用if else梯子来实现它?
在Python中,有一种方便的方法可以获取名为"切片"的列表的一部分:
a = [1,2,3,4,5,6,7,8,9,10] # ? a = range(1,10)
a[:3] # get first 3 elements
a[3:] # get all elements except the first 3
a[:-3] # get all elements except the last 3
a[-3:] # get last 3 elements
a[3:7] # get 4 elements starting from 3rd (? from 3rd to 7th exclusive)
a[3:-3] # get all elements except the first 3 and the last 3
Run Code Online (Sandbox Code Playgroud)
clojure.repl/doc在Clojure中玩,我找到了所有这些的等价物,但我不确定它们是不是惯用的.
(def a (take 10 (iterate inc 1)))
(take 3 a)
(drop 3 …Run Code Online (Sandbox Code Playgroud) 各种Clojure风格指南建议避免使用超过80个字符的行.我想知道是否有一种惯用的方法来避免长String文字.
虽然这些日子通常有宽屏幕,但我仍然同意应该避免长线.
以下是一些例子(我很想跟随第一个例子):
;; break the String literal with `str`
(println (str
"The quick brown fox "
"jumps over the lazy dog"))
;; break the String literal with `join`
(println (join " " [
"The quick brown fox"
"jumps over the lazy dog"]))
Run Code Online (Sandbox Code Playgroud)
我知道Clojure支持多行String文字,但使用这种方法会有解释换行符的不良影响,例如使用repl:
user=> (println "The quick brown fox
#_=> jumps over the lazy dog")
The quick brown fox
jumps over the lazy dog
Run Code Online (Sandbox Code Playgroud) 我正在玩JMH(http://openjdk.java.net/projects/code-tools/jmh/),我偶然发现了一个奇怪的结果.
我正在对数组的浅层副本进行基准测试,我可以观察到预期的结果(循环遍历数组是一个坏主意#clone(),System#arraycopy()并且在Arrays#copyOf()性能方面没有显着差异).
除了System#arraycopy()是一个季度的慢时,数组的长度是硬编码的......等等,什么?这怎么会慢?
有没有人知道可能是什么原因?
结果(吞吐量):
# JMH 1.11 (released 17 days ago)
# VM version: JDK 1.8.0_05, VM 25.5-b02
# VM invoker: /Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home/jre/bin/java
# VM options: -Dfile.encoding=UTF-8 -Duser.country=FR -Duser.language=fr -Duser.variant
# Warmup: 20 iterations, 1 s each
# Measurement: 20 iterations, 1 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Throughput, ops/time
Benchmark Mode Cnt Score Error Units
ArrayCopyBenchmark.ArraysCopyOf thrpt …Run Code Online (Sandbox Code Playgroud) 我正在尝试为我的clojure函数编写一些单元测试(我正在使用clojure.test,但如果需要我可以切换到midje).
我有一个函数,如下所示:
(defn GenerateNodes
[is-sky-blue? hot-outside? name]
(cond
(is-sky-blue? name) (generate-sky-nodes)
(hot-outside?) (generate-hot-nodes)))
Run Code Online (Sandbox Code Playgroud)
单元测试此函数时,我想编写以下测试用例:
(deftest when-sky-blue-then-generate-sky-nodes
(let [is-sky-blue true]
(GenerateNodes (fn[x] println "sky nodes generated."))
(is (= true Was-generate-hot-nodes-called?))
Run Code Online (Sandbox Code Playgroud)
如何断言函数generate-sky-nodes被调用?或不 ?我会在C#或java中使用一个模拟框架,但我不知道clojure.
我正试图在clojure中重写以下片段,但这一切都很难看,也许有人会建议一个更优雅的解决方案?
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class ZipFileRdrExp {
public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream("C:\\MyZip.zip");
ZipInputStream zis = new ZipInputStream(fis);
ZipEntry ze;
while((ze=zis.getNextEntry())!=null){
System.out.println(ze.getName());
zis.closeEntry();
}
zis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我对getNextEntry重复调用的丑陋尝试:
(ns app.core
(:import
(java.io FileInputStream FileNotFoundException IOException File)
(java.util.zip ZipInputStream ZipEntry)))
(defn- read-zip [zip-file]
(let [fis (FileInputStream. zip-file)
zis (ZipInputStream. fis)]
(loop [ze (.getNextEntry …Run Code Online (Sandbox Code Playgroud) 我正在尝试自学clojure,我正在使用Prime Factor Kata和TDD的原则来实现这一目标.
通过一系列像这样的Midje测试:
(fact (primefactors 1) => (list))
(fact (primefactors 2) => (list 2))
(fact (primefactors 3) => (list 3))
(fact (primefactors 4) => (list 2 2))
Run Code Online (Sandbox Code Playgroud)
我能够创建以下功能:
(defn primefactors
([n] (primefactors n 2))
([n candidate]
(cond (<= n 1) (list)
(= 0 (rem n candidate)) (conj (primefactors (/ n candidate)) candidate)
:else (primefactors n (inc candidate))
)
)
)
Run Code Online (Sandbox Code Playgroud)
这很有效,直到我抛出以下边缘案例测试:
(fact (primefactors 1000001) => (list 101 9901))
Run Code Online (Sandbox Code Playgroud)
我最终得到了堆栈溢出错误.我知道我需要将其转换为适当的重复循环,但我看到的所有示例似乎都过于简单,仅指向计数器或数值变量作为焦点.如何进行递归?
谢谢!
我正在玩Clojure(1.6)和JavaFX 8,一开始我遇到了问题.例如,这个非常简单的代码失败了:
(ns xxyyzz.core)
(gen-class :name "xxyyzz.core.App"
:extends javafx.application.Application
:prefix "app-")
(defn app-start [app stage]
(let [button (javafx.scene.control.Button.)]))
(defn launch []
(javafx.application.Application/launch xxyyzz.core.App (into-array String [])))
(defn -main []
(launch))
Run Code Online (Sandbox Code Playgroud)
这是堆栈跟踪的最后一部分似乎相关:
Caused by: java.lang.ExceptionInInitializerError
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:340)
at clojure.lang.RT.classForName(RT.java:2070)
at clojure.lang.Compiler$HostExpr.maybeClass(Compiler.java:969)
at clojure.lang.Compiler$HostExpr.access$400(Compiler.java:747)
at clojure.lang.Compiler$NewExpr$Parser.parse(Compiler.java:2494)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6560)
... 48 more
Caused by: java.lang.IllegalStateException: Toolkit not initialized
at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:276)
at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:271)
at com.sun.javafx.application.PlatformImpl.setPlatformUserAgentStylesheet(PlatformImpl.java:562)
at com.sun.javafx.application.PlatformImpl.setDefaultPlatformUserAgentStylesheet(PlatformImpl.java:524)
at javafx.scene.control.Control.<clinit>(Control.java:81)
... 55 more
Run Code Online (Sandbox Code Playgroud)
我根本不会说Java,但研究它似乎问题在于Clojure及其导入Java类的方式.如果我理解正确,在导入时它会运行类静态初始化程序,并且对于某些Button崩溃的JavaFX类(在我的例子中).
猜猜我有两个问题:我对这个错误的理解是否正确?第二,有办法以某种方式解决这个问题吗?我尝试在(ns)声明中提取函数内部的导入,但它仍然不起作用.
如果没有Clojure修复,是否可以通过一些额外的Java代码修复?
欢迎任何提示和指示!
对于列表和向量,我们可以对序列进行切片并采用我们想要的任何部分.如何对映射对象进行类似的操作?
例如,我有一个地图对象列表,
(def plays [
{:name "Burial", :plays 979, :loved 9}
{:name "Eno", :plays 2333, :loved 15}
{:name "Bill", :plays 979, :loved 9}
{:name "Magma", :plays 2665, :loved 31}])
Run Code Online (Sandbox Code Playgroud)
对于每个地图,我想切掉播放列,并添加默认值的速率列,这是什么惯用方法?