clojure - :tag metadata clojure

标签 clojure metadata

在以下示例中(摘自 Programming Clojure, 2nd ed 书:

(defn ^{:tag String} shout [^{:tag String} s] (.toUpperCase s))

:tag 元数据的值是多少? 做一个:

((map #'shout) :tag)

产生java.lang.String,但是如果我无法区分输入和输出参数,到底会传达什么信息?

最佳答案

我在阅读《Programming Clojure》第三版时遇到了同样的问题,其中示例略有更新:

(defn ^{:tag String} shout [^{:tag String} s] (clojure.string/upper-case s))

这相当于缩写形式:

; I guess tags and type hints are equivalent
(defn ^String shout [^String s] (clojure.string/upper-case s))

正如您所说,如果您查找函数元数据,如果标签引用输入或输出参数,则它是不明确的:

(meta #'shout)

...返回

{:tag java.lang.String,
 :arglists ([s]),
 etc... }

如果您考虑一下,它必须是返回类型,因为函数可以有 N 个参数,但 Clojure 不允许多个返回值。元数据中的 :tag 不是向量,而是单个值。

如果您实际上以编程方式需要函数参数的标记/类型提示,则可以在 :arglists 上调用元函数,如下所示:

https://stackoverflow.com/a/26116353/695318

关于clojure - :tag metadata clojure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14185129/

相关文章:

clojure - clojure 中惯用的惰性原子

maven - 如何在 clojure 项目中使用 maven repo 中的库?

php - 如何使用 PHP 从 JPG 读取 XMP 数据?

ruby - 如何在 Rails 4 应用程序中设置 "application/ld+json"schema.org 元数据

linux - iTunes aiff 上缺少元数据

Java ImageIO,无法更改元数据树

msbuild - 如何在 MSBuild 中获取扩展名(不带点)

clojure - 逆时针查找符号文档

clojure - 如何在 Clojure 1.8 中从 leiningen 或 boot 启动套接字 REPL?

debugging - 返回 Clojure 中当前所有作用域符号的表达式?