请在2024年Clojure状态调查!分享您的想法。

欢迎!请参阅关于页面以获取有关该工作方式的更多信息。

+4
编译器
已关闭

由用户yuhan在slack上发现https://clojurians.slack.com/archives/C03S1KBA2/p1724499452475139

❯ clj -Sdeps '{:deps {org.clojure/clojure {:mvn/version "1.12.0-rc1"}}}'
Clojure 1.12.0-rc1
user=> (definterface Foo (^String/1 bar []))
user.Foo
user=> (reify Foo (bar [this]))
Syntax error (ClassNotFoundException) compiling reify* at (REPL:1:1).
java.lang.String.1
user=>
备注已关闭: 在1.12.0-rc2中发布

1 答案

0

感谢您帮助发表该问题!

为了提供更多背景信息,我发现由于生成的函数是动态类型的,因此与相同的元标签一起生成的defprotocol会产生一个有效的接口,因为这些标签仅作为类型提示放置在协议映射中。

user=> (defprotocol PFoo (^String/1 bar [this]))
PFoo
user=> (reify user.PFoo (bar [this] :ok))
#object[user$eval196$reify__197 0x64a9d48c "user$eval196$reify__197@64a9d48c"]
user=> (bar *1)
:ok
user=> (first (.getMethods (:on-interface PFoo)))
#object[java.lang.reflect.Method 0x35178483 "public abstract java.lang.Object user.PFoo.bar()"]

尽管它生成一个不可读的符号 feels同样错误

user=> (:sigs PFoo)
{:bar {:tag [Ljava.lang.String;, :name bar, :arglists ([this]), :doc nil}}
user=> (get-in PFoo [:sigs :bar :tag])
[Ljava.lang.String;
user=> (class *1) ; oh no
clojure.lang.Symbol
by
谢谢!为了明确起见,我在上面的最后一句中说的“难以阅读”是指语法上不可回滚。这里有一个独立的复现实例
    
    user> (defprotocol P (^int/5 oops [this]))
    P
    user> (get-in P [:sigs :oops])
    {:tag [[[[[I, :name oops, :arglists ([this]), :doc nil}
    user> (read-string (pr-str *1))
    执行错误发生在 user/eval162 (REPL:1).
    不匹配的分隔符:}

这个 `[[[[I` 符号可能应该被转换为字符串或以原始语法存储(后者现在是标准的表示吗?
by
谢谢提供的复现。我认为这应该是一个不同的工单。我会尽快准备一个。
...