【问题标题】:Why does ^metadata 'symbol not work?为什么 ^metadata 的符号不起作用?
【发布时间】:2023-04-01 20:56:01
【问题描述】:

documentation on metadata 声称 ^{:hi 10} 'x 等同于 (with-meta 'x {:hi 10}),但我看不到。

在 repl 上评估以下内容,

(binding [*print-meta* true]
  (prn ^{:hi 10} 'x)
  (prn (with-meta 'x {:hi 10})))

打印以下内容,这表明第一种情况没有附加元数据。

x
^{:hi 10} x

我做错了吗?

【问题讨论】:

    标签: clojure metadata read-eval-print-loop


    【解决方案1】:

    ^ 是一个reader macro,它将元数据附加到它后面的表单中。但是,'x 不是可以应用元数据的形式;它通过' 阅读器宏扩展为(quote x)。当您键入 ^{:hi 10} 'x 时,元数据会附加到未评估的 (quote x) 表单而不是裸符号 x

    user> (set! *print-meta* true)
    user> (prn (read-string "'x"))
    (quote x)
    user> (prn (read-string "^{:hi 10} 'x"))
    ^{:hi 10} (quote x)
    

    但是,使用元数据评估表单不会将元数据传递到结果中:

     user> (prn (eval (read-string "^{:hi 10} 'x")))
     x
    

    您可以通过将^ 放置在' 之后 将元数据附加到带引号的符号,如下所示:

    user> (prn (read-string "'^{:hi 10} x"))
    (quote ^{:hi 10} x)
    user> (prn '^{:hi 10} x)
    ^{:hi 10} x
    

    【讨论】:

      猜你喜欢
      • 2016-08-21
      • 2013-04-18
      • 1970-01-01
      • 1970-01-01
      • 2014-02-19
      • 2017-10-08
      • 1970-01-01
      • 1970-01-01
      • 2020-04-11
      相关资源
      最近更新 更多