Clojure CLR - 实现包含属性的接口

Fra*_*ale 4 clojure clojureclr

我正在尝试实现一个具有属性的界面,但似乎无法让它工作,我还没有通过谷歌找到任何相关的例子(还).我确定我在这里做了一些完全错误但却不知道如何解决它.

(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)

更新:

发布的deftype代码有效,我无法重现上面发布的错误.我现在不知道我当时做错了什么.

Fra*_*ale 9

这花了我几个小时的研究和试错,但我终于成功了!

user=> (def foo-handler
(reify System.Web.IHttpHandler
        (get_IsReusable [this] false)
        (ProcessRequest [this context] ())))
#'user/foo-handler
user=>
Run Code Online (Sandbox Code Playgroud)

成功!

user=> (instance? System.Web.IHttpHandler foo-handler)
true
Run Code Online (Sandbox Code Playgroud)

这种方式更好,并且可以从ASP.NET应用程序中正常工作:

(deftype foo-handler []
  System.Web.IHttpHandler
  (get_IsReusable [this] false)
  (ProcessRequest [this context] 
    (.Write (.Response context) "Hello, From Clojure CLR!")))
Run Code Online (Sandbox Code Playgroud)