在Clojure中表示树的惯用方法是什么?例如:
A
/ \
B C
/\ \
D E F
Run Code Online (Sandbox Code Playgroud)
性能并不重要,树木不会超过1000个元素.
我正在撞墙试图理解一些使用非引号拼接的Clojure宏,我似乎无法找到任何需要它们的明显扩展.任何人都可以用虚拟术语向我解释一下吗?
我在http://clojure.org/libraries找不到处理时间和日期的库.有没有,或者这是我必须弄清楚如何直接用Java做的事情?
我是Clojure新手并且正在寻找何时使用协议以及何时使用多方法的一些具体示例.我知道协议通常适用于创建类型层次结构和典型的OOP事物,它们是在多方法之后添加到语言中的,并且协议通常具有更好的性能,所以我的问题是:
协议是否意味着取代多方法?如果没有,你能给我一个例子,我会使用多方法而不是协议吗?
我已经阅读了很多关于Clojure在并发性方面有多棒的内容,但我读过的教程中没有一个实际上解释了如何创建一个线程.你刚才做(.start(Thread.func)),还是有另外一种我错过的方式?
我正在寻找轻量级的东西,至少应该支持以下功能:
我知道为这些选项中的每一个推出自己的微框架相对容易,但是如果像这样的东西已经存在,为什么要重新发明轮子呢?特别是如果它是:
我无法理解如何在Clojure中创建一个懒惰的序列.
宏的文档对我来说一点也不清楚:
用法:(lazy-seq&body)获取一个返回ISeq或nil的表达式体,并生成一个Seqable对象,该对象仅在第一次调用seq时调用body,并将缓存结果并在随后的所有内容中返回seq电话.
我见过的所有例子似乎都是这样的:
; return everything in the sequence starting at idx n
(defn myseq-after-n [n]
(...)
)
(def my-lazy-seq
(lazy-seq (conj [init-value] (myseq-after-n 2)))
)
Run Code Online (Sandbox Code Playgroud)
所以,我没有得到的第一件事是,因为lazy-seq不在调用conj之外,它是如何阻止conj在评估时生成无限序列的?
我的第二个问题是,懒惰的序列定义总是采用这种一般形式吗?
是否有可能在使用leiningen的项目中与Clojure一起轻松管理和编译本机Java类?
我工作在一个相当低的水平(使用netty nio),并认为一些管道类实际上更容易处理作为原始java在构造代码和性能方面.
假设我有以下数据模型,用于跟踪棒球运动员,球队和教练的统计数据:
data BBTeam = BBTeam { teamname :: String,
manager :: Coach,
players :: [BBPlayer] }
deriving (Show)
data Coach = Coach { coachname :: String,
favcussword :: String,
diet :: Diet }
deriving (Show)
data Diet = Diet { dietname :: String,
steaks :: Integer,
eggs :: Integer }
deriving (Show)
data BBPlayer = BBPlayer { playername :: String,
hits :: Integer,
era :: Double }
deriving (Show)
Run Code Online (Sandbox Code Playgroud)
现在让我们说经常是牛排狂热分子的经理想要吃更多的牛排 - 所以我们需要能够增加经理人饮食中的牛排含量.以下是此功能的两种可能实现:
1)这使用了大量的模式匹配,我必须得到所有构造函数的所有参数排序正确...两次.它似乎不会很好地扩展或者非常易于维护/读取.
addManagerSteak :: BBTeam -> BBTeam
addManagerSteak (BBTeam …Run Code Online (Sandbox Code Playgroud) 我见过很多Clojure程序员热衷于新的core.async库,虽然看起来非常有趣,但我很难看到它是如何符合Clojure原则的,所以我有这些问题:
因为"go"是一个宏(从而修改代码结构)并确保"<!" 直接在go-block中使用,不能使用"<!" 在另一个函数里面,像这样:
(defn take-and-print [c]
(println (<! c)))
(def ch (chan 1))
(>!! ch 123)
(go (take-and-print ch))
Assert failed: <! used not in (go ...) block
Run Code Online (Sandbox Code Playgroud)
在我看来,这可以防止简单性和可组合性.为什么不是问题?
也许作为前两个问题的结果,core.async的许多代码使用较低级别的构造,例如loop/recur而不是map/filter/reduce.这不是倒退吗?
我在哪里错过了这一点?
提前致谢.
clojure ×10
concurrency ×1
core.async ×1
frameworks ×1
haskell ×1
integration ×1
java ×1
leiningen ×1
multimethod ×1
rest ×1
web-services ×1