所以基本上我不是在这里比较Scheme和Clojure,我想比较一下实现.有:
Clojure-clr,即使使用Visual Studio扩展也可以安装,但我仍然有点用这种方式使用它.创建并保存此类项目后,无法再次打开它...
而IronScheme,就我所知,还没有针对IronScheme的VS插件,但也许它得到了更好的.NET支持,我从未使用它,也无法了解它.
那么这两个(或者甚至还有其他类似lisp语法的东西)得到了更好的CLR支持?
我正在尝试实现一个具有属性的界面,但似乎无法让它工作,我还没有通过谷歌找到任何相关的例子(还).我确定我在这里做了一些完全错误但却不知道如何解决它.
(System.Reflection.Assembly/LoadWithPartialName "System.Web")
; naive, just trying to figure out how to implement the IHttpHandler interface in Clojure
(defn foo-handler []
(reify System.Web.IHttpHandler
(IsReusable [] false)
(ProcessRequest [context] ())))
Run Code Online (Sandbox Code Playgroud)
IsReusable是一个属性,我不知道如何告诉reify它不是一个传统的功能.
CompilerException clojure.lang.CljCompiler.Ast.ParseException: Must supply at least one argument for 'this' in: IsReusable
Run Code Online (Sandbox Code Playgroud)
好的,我为IsReusable提供'this'
CompilerException clojure.lang.CljCompiler.Ast.ParseException: Can't define method not in interfaces: IsReusable
Run Code Online (Sandbox Code Playgroud)
我也试过代理,但我得到了类似的结果.
我也尝试将IsReusable命名为get_IsReusable,这实际上没有什么区别,我得到的编译错误与上面相同.
我也试过deftype但是我得到了一个完全不同的错误:
(deftype foo-handler []
System.Web.IHttpHandler
(get_IsReusable [this] false)
(ProcessRequest [this context] ()))
Run Code Online (Sandbox Code Playgroud)
编译错误:
InvalidCastException Unable to cast object of type 'clojure.lang.Var' to type 'System.Type'. clojure.lang.Namespace.ReferenceClass
Run Code Online (Sandbox Code Playgroud)
更新: …
场景:我有一台服务器正在监听六个活动的TCP/IP连接.当"就绪"消息进入时,将在其自己的线程上引发事件.当服务器从每个连接收到"就绪"消息时,它需要运行"启动"功能.
我面向对象的解决方案可能涉及使用互斥锁和计数器.就像是:
int _countDown= 6;
object _lock;
void ReadyMessageReceivedForTheFirstTimeFromAConnection() {
lock(_lock) {
--_countDown; //
if (_countDown==0) Start();
}
}
Run Code Online (Sandbox Code Playgroud)
如果不诉诸锁/互斥锁,怎么能在Clojure中解决这个问题呢?
可能很明显,但是给出了这段代码(来自http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/reify):
(defn reify-str []
(let [f "foo"]
(reify Object
(ToString [this] f))))
(defn -main [& args]
(println (reify-str))
(System.Console/ReadLine))
Run Code Online (Sandbox Code Playgroud)
为什么我得到这个输出?
#<ui$reify_str$reify__4722__4727 foo>
Run Code Online (Sandbox Code Playgroud)
代替:
foo
Run Code Online (Sandbox Code Playgroud)
我在Windows中运行ClojureCLR,如果有帮助的话.谢谢!