2024 年 Clojure 调查中分享您的想法!

欢迎!请参阅关于页面了解有关如何使用此功能的更多信息。

+1
core.match

core.match 中进行 Class 对象匹配时,默认情况下,用于命名 Class 对象的符号被视为通配符模式,就像任何其他符号一样。基本用法文档显示了此行为,并建议局部重新绑定以获取预期的行为。

重新绑定是一个合适的解决方案,但我在编写或阅读代码时发现,很容易忽略缺少的绑定。另一个解决方案可能是使用全限定类名

(match [(type 1)]
  [java.lang.String] :string
  [java.lang.Long] :long
  :else :no-match)

通过采用这种约定,开发者不需要看比模式更大的任何作用域来知道类名是否可以正确解析,这使得在阅读代码时更容易发现错误(这很可能还使它更容易进行代码审查)。

但是,该语法目前不支持

Syntax error (ClassFormatError) compiling fn* at (REPL:1:1).
Illegal field name "java.lang.String" in class user$eval1591

没有命名空间且包含一个或多个点的符号在一般情况下指示类名,如 记录,并且在局部绑定中无效(因此出现错误),因此支持此语法不应与其他任何可能的符号含义冲突。

2 个答案

0
0
AMD amp;由

请注意,类符号指的是类实例,它们不是常量,因此不应该在展开的代码中存在。因此,需要特别注意将其扩展到运行时可以适当匹配的内容。我认为这可能是可行的,但可能比表面上看到的要复杂一些。

...