Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用包含类型提示的宏生成Clojure代码_Clojure_Macros_Metaprogramming_Code Generation_Type Hinting - Fatal编程技术网

使用包含类型提示的宏生成Clojure代码

使用包含类型提示的宏生成Clojure代码,clojure,macros,metaprogramming,code-generation,type-hinting,Clojure,Macros,Metaprogramming,Code Generation,Type Hinting,我试图用类型提示生成一些Clojure代码,但是每当我构建一些代码时,类型提示似乎就消失了(编译代码时它们也不起作用) e、 g 我不确定为什么类型提示会消失,但我认为这与读者如何处理metatdata有关 在生成的代码中创建正确类型提示的正确方法是什么?这个问题有两个答案。回答您的具体问题:在您刚刚发布的实际代码中,没有任何错误:它工作正常(设置!*print meta*true)然后重试,您将看到元数据注释。它通常不会打印 但是,总的来说,这不是从宏观角度做事情的正确方法,不久你就会遇到麻烦

我试图用类型提示生成一些Clojure代码,但是每当我构建一些代码时,类型提示似乎就消失了(编译代码时它们也不起作用)

e、 g

我不确定为什么类型提示会消失,但我认为这与读者如何处理metatdata有关


在生成的代码中创建正确类型提示的正确方法是什么?

这个问题有两个答案。回答您的具体问题:在您刚刚发布的实际代码中,没有任何错误:它工作正常
(设置!*print meta*true)
然后重试,您将看到元数据注释。它通常不会打印

但是,总的来说,这不是从宏观角度做事情的正确方法,不久你就会遇到麻烦。请记住,您不需要宏计算的表单上的元数据,而是需要宏发出的表单上的元数据。因此,更准确的解决方案是在要附加元数据的符号或表单上使用
和meta
,或者,如果它们是用户提供的表单,通常应该使用
vary meta
,这样就不会丢弃它们显式添加的元数据。比如说,

(defmacro with-image [name & body]
  (let [tagged-name (vary-meta name assoc :tag `BufferedImage)
    `(let [~tagged-name (create-buffered-image)
       ~@body)))

(with-image i (.getRGB i 0 0))

你能更具体地说一下“你不久就会有麻烦”吗?什么样的麻烦?某些形式(特别是IIRC,在列表上)的类型提示将在宏观扩展期间消失,如果它们以mikera的问题演示的方式而不是我建议的方式出现。
(defmacro with-image [name & body]
  (let [tagged-name (vary-meta name assoc :tag `BufferedImage)
    `(let [~tagged-name (create-buffered-image)
       ~@body)))

(with-image i (.getRGB i 0 0))