我正在Grails 2.0.0 (和2.1.0-SNAPSHOT)中扩展Grails Clojure插件 ,我想将其更新到Clojure 1.3.0并添加clojure.tools.logging 。 在clojure.tools.logging的日志stream函数中编译ByteArrayOutputStream的代理时 ,Clojure抛出exception: ClassCastException: clojure.asm.Type cannot be cast to clojure.lang.IFn ( https://gist.github.com/a6ae681c37091a3d2379 ) 我去了,并删除clojure.tools.logging并写了一个剥离代理 Object : (proxy [java.lang.Object] [] (toString [] "proxy's toString")) 还抛出了同样的ClassCastException和消息。 我试图打印代理的macroexpand-1 ,并得到同样的事情。 我回到了Clojure 1.2.0, 代理再次正常工作。 我尝试了1.4.0的一些化身,它们performance出与1.3.0相同的行为。 1.2.1也会抛出一些exception,但是我正在尝试打1.3.0,所以我没有花太多时间。 堆栈跟踪指向core_proxy.clj中generate-proxy的letforms之一中定义的gen-method函数。 我在那里添加了一些println的东西,看看能不能发现。 也许这下一个陈述将会泄露读者的一个巨大的误解,但只是添加这些println改变了编译时间的行为,我完全没有想到的方式。 即使所有mvn package的Clojuretesting都继续通过,exception位置和exceptiontypes也完全改变了。 例如,在开始生成字节码之前,只需要将一个println添加到gen-method,就可以抛出Clojure ClassCastException: clojure.lang.PersistentArrayMap cannot be cast to java.lang.Class ( https://gist.github.com/5a7a40929a6c4a104bd5 ) 我已经看到了各种其他的错误,取决于我把println (s)放在哪里,但这是最stream行的。 […]
我来与这个: (defn string-> integer [str&[base]] (Integer / parseInt str(if(nil?base)10 base))) (string – >整数“10”) (string – >整数“FF”16) 但是这一定是一个更好的方法。
在Clojure中,我想结合两个列表给出一个对列表, > (zip '(1 2 3) '(4 5 6)) ((1 4) (2 5) (3 6)) 在Haskell或Ruby中,函数被称为zip 。 实现它并不困难,但我想确保在Core或Contrib中不会缺less函数。 Core中有一个zip命名空间,但它被描述为提供对Zipperfunction技术的访问,这看起来并不是我所追求的。 是否有一个相同的function,结合2个或更多的列表,这样,在核心? 如果没有,是不是因为有一种惯用的方法使得这个function不需要呢?
我如何评论Clojure中的多行?
我是Clojure的新手,已经使用Compojure编写基本的Web应用程序。 不过,我用Compojure的defroutes语法打了一堵墙,而且我认为我需要了解它背后的“如何”和“为什么”。 它看起来像一个环形风格的应用程序开始于一个HTTP请求映射,然后通过一系列中间件函数传递请求,直到它被转换成一个响应映射,然后发送回浏览器。 这种风格对于开发人员来说似乎太“低级”了,因此需要像Compojure这样的工具。 我可以看到在其他软件生态系统中也需要更多的抽象,尤其是Python的WSGI。 问题是我不了解Compojure的方法。 让我们来看看下面的defroutes Sexpression式: (defroutes main-routes (GET "/" [] (workbench)) (POST "/save" {form-params :form-params} (str form-params)) (GET "/test" [& more] (str "<pre>" more "</pre>")) (GET ["/:filename" :filename #".*"] [filename] (response/file-response filename {:root "./static"})) (ANY "*" [] "<h1>Page not found.</h1>")) 我知道理解这一切的关键在于一些macros观的巫术,但我不完全理解macros(还)。 我已经盯了很久了,但不明白! 这里发生了什么? 了解“大创意”可能会帮助我回答这些具体问题: 如何从路由function(例如workbenchfunction)中访问Ring环境? 例如,假设我想要访问HTTP_ACCEPT头或请求/中间件的其他部分? 与解构有什么关系( {form-params :form-params} )? 什么关键字可供我解构时使用? 我真的很喜欢Clojure,但我很难过!
我想了解clojure协议,他们应该解决什么问题。 有没有人有clojure协议的什么和什么明确的解释?
我从其他Lisp(特别是Scheme)那里获得了一些知识。 最近我一直在阅读关于Clojure 。 我看到它有“符号”和“关键字”。 我熟悉的符号,但不包含关键字。 其他Lisp有关键字吗? 除了具有不同的符号(即:冒号)之外,关键字与符号有什么不同?
我想要使用相同的键将一个值的地图转换为另一个地图,但是将值应用于一个函数。 我认为在clojure api中有这样做的function,但我一直无法find它。 这是我正在寻找的一个示例实现 (defn map-function-on-map-vals [mf] (reduce (fn [altered-map [kv]] (assoc altered-map k (fv))) {} m)) (println (map-function-on-map-vals {:a "test" :b "testing"} #(.toUpperCase %))) {:b TESTING, :a TEST} 有没有人知道map-function-on-map-vals已经存在? 我会认为它(也可能有一个更好的名字)。
我读了vector不是序列,但列表是。 我不确定使用一个的理由是什么。 看起来vector是最常用的,但这是有原因的吗?
在Clojure中testing列表是否包含给定值的最好方法是什么? 特别是contains?的行为contains? 目前令我困惑的是: (contains? '(100 101 102) 101) => false 我显然可以写一个简单的函数来遍历列表并testing它是否相等,但是肯定有一个标准的方法来做到这一点?