我有兴趣在CLR上调查Clojure.我看到有一个端口 -但我总是对这些二等公民有点怀疑(即他们没有原始的稳定性或功能).如果一般人们发现CLR上的Clojure不成熟,我就不太愿意花这么多时间 - 我现在根本没有时间或精力去解决一堆问题.另一方面,如果CLR上的Clojure看起来很好吃,我今天就开始潜水吧!
在CLR上有没有关于Clojure的实际经验?
任何有关CLR版本的建议和/或其他帮助也将受到赞赏.
clojure-clr有多成熟?这是否支持clojure/jvm提供的所有功能?它是否在Mono上运行没有任何问题?
我尝试了clojure-clr,它似乎与REPL一起使用.但是,当我尝试运行示例时mono Clojure.Main.exe clojure/samples/ants.clj,我收到了一堆错误消息.这是在Mono上运行clojure-clr的问题吗?
我一直在和Clojure-CLR一起玩.我的REPL正在工作,我可以从Clojure调用.NET类,但我无法弄清楚从C#类调用编译的Clojure dll.
我从示例顶部删除了:name行,因为它导致"Duplicate key :: name"错误.没有":name"行,代码编译得很好,我可以在Visual Studio中添加引用,但我似乎无法弄清楚如何使用代码.我尝试了各种"使用"语句,但到目前为止还没有任何效果.任何人都可以对此提供一点见解吗?这是我试图使用的Clojure代码.
(ns code.clojure.example.hello
(:gen-class
:methods [#^{:static true} [output [int int] int]]))
(defn output [a b]
(+ a b))
(defn -output
[a b]
(output a b))
Run Code Online (Sandbox Code Playgroud) 所以有列表?,seq?,vector ?, map?等等以确定参数的集合类型.
什么是区分它们的好方法
有没有比这更好的方法
#(or (seq? %) (list? %) etc)
Run Code Online (Sandbox Code Playgroud) CVM上的Clojure与CLR的性能比较是否存在?或者也许那些同时使用性能敏感代码的人可以给出一些轶事评论?
显然,你不能使用记录构造函数调用apply:
(defrecord Foo. [id field])
(apply Foo. my-list)
Run Code Online (Sandbox Code Playgroud)
在读取时失败,因为它不期待Foo.在那个地方.
我能想到的唯一明显的解决方法是添加工厂功能:
(make-foo [id field] (Foo. id field))
Run Code Online (Sandbox Code Playgroud)
当然可以申请.
我错过了什么吗?我希望这可以来自C#/ Java,但只是觉得它在Clojure中有点令人失望......
我决定研究Clojure(受本书启发).经过一些研究后,我了解到我可以通过使用ClojureCLR来利用我的.Net经验,而不需要学习各种Java库.但是,我发现很少有关于Clojure的CLR版本的文档(甚至官方网站似乎都会将您推向JVM实现的文档).
有谁知道哪里可以找到一些像样的教程,书籍,文章或文档?如果确实没有,可以安全地假设我可以通过JVM实现了解我需要知道的大部分内容(即两个实现之间没有什么区别,因此知识可以公平转移)?
如果需要,我愿意学习JVM版本和Java库(很好地扩展......这就是为什么我首先要研究函数/ lisp语言).
如果可能的话,我正在寻找一种更惯用的方法来编写以下clojure代码:
(import '(System.Net HttpWebRequest NetworkCredential)
'(System.IO StreamReader))
(defn downloadWebPage
"Downloads the webpage at the given url and returns its contents."
[^String url ^String user ^String password]
(def req (HttpWebRequest/Create url))
(.set_Credentials req (NetworkCredential. user password ""))
(.set_UserAgent req ".NET")
(def res (.GetResponse req))
(def responsestr (.GetResponseStream res))
(def rdr (StreamReader. responsestr))
(def content (.ReadToEnd rdr))
(.Close rdr)
(.Close responsestr)
(.Close res)
content
)
Run Code Online (Sandbox Code Playgroud)
这是在ClojureCLR上工作的.(事实上它是CLR变种并不重要)
我想摆脱defs(替换为let?它们可以互相引用吗?)
如何更好地进入流 - 请记住..链接不起作用,因为我需要稍后关闭流.
编辑:在答案之后,我发现在.NET中使用WebClient类下载网页更容易.我仍然使用了许多Michal的推荐方法 - 只想记录我现在认为最好的答案:
(defn download-web-page
"Downloads the webpage at the given url …Run Code Online (Sandbox Code Playgroud) 我爱Clojure.这是迄今为止我最喜欢的语言.
我刚刚发现Xamarin,它允许你拥有跨平台的应用程序,充分利用本机库.与它一起使用的语言是C#.
现在我想知道是否有任何方法可以在Clojure(CLR)中编写我的大多数Xamarin应用程序,而不是C#.
我的程序中有很多记录,我最终使用其中一个字段作为键放入地图.例如
(defrecord Foo. [id afield anotherfield])
Run Code Online (Sandbox Code Playgroud)
然后我将其添加到id为关键的地图中.这一切都非常可行,但有点单调乏味,例如在向地图添加新的Foo实例时,我需要先提取密钥.我想知道clojure.core中的某个地方是否存在已经存在的数据结构?
基本上我想通过在集合的构造时给组映射函数(即:id)设置一个值来构造一组Foo,然后在我想添加/查找/删除/时使用它. . 一个值.
所以代替:
(assoc my-map (:id a-foo) a-foo))
Run Code Online (Sandbox Code Playgroud)
我能做到,说:
(conj my-set a-foo)
Run Code Online (Sandbox Code Playgroud)
更有趣的是,合并和合并 - 支持.