我认为clj-kondo在某些方面更进一步。我只是在想语法规范在读取时的实现。这不会包括其他函数返回类型或其他知识。
我想象的是
```
(defn foo [a b & options]
...)
(s/fdef foo
:syntax (s/cat :a (s/or symbol? list? int?)
:b (s/or symbol? list? string?)
:options (s/cat :one (s/? (s/cat :opt #{:one} :val (s/or symbol? list? boolean?)))
:two (s/? (s/cat :opt #{:two} :val (s/or symbol? list? #{:fast :slow}))))
(foo 10 (get-b) :one true :two :slow)
```
因此,`fdef`规范接收一个额外的`:Syntax`规范,用于确保函数调用语法符合规范。这将是纯粹的语法检查,这也是为什么我经常允许`(s/or symbol? list? ...)`,也许在这里提供一个方便的指定对于要么是符号、要么是形式、要么是文文学的给定值是有用的,因为所有函数参数都会遵循这个模式。
但是,这仍然提供了很多价值,并且看起来相当简单就可以添加,不需要创建任何类型概念,并且不需要在程序中跟踪类型。这似乎很符合Spec。这只是一个让相同的Spec语法检查宏已经得到函数的执行。因此,这阻止了我传递不支持选项、在函数接受的关键词中进行打字错误、传递错误的枚举值给选项等。因此,它至少涵盖了所有文法的使用。