Clojure宏:在宏中执行代码

阿什什尼吉

我想创建一个宏,以便可以在变量本身内部添加变量名称。我有这张Unit唱片。它的name成员存储将要创建的变量的名称。即喜欢,(def a-variable (->Unit 1 1 "a-varible"))但我不想自己传递变量名。

而且我认为宏可以派上用场。:)

这是代码:

(defrecord Unit 
    [value gradient name]
  Object
  (toString [_]
    (str name " : ")))


(defmacro create-unit1 [var-name & body]
  `(def ~var-name ~(concat body (list (name var-name)))))

(defmacro create-unit2 [var-name & body]
  `(def ~var-name (concat ~@body (list (name '~var-name)))))

但是他们都没有给我写代码:

neurals.core> (macroexpand '(create-unit1 a (->Unit 1.0 0.0)))
(def a ((->Unit 1.0 0.0) "a"))

neurals.core> (macroexpand '(create-unit2 a (->Unit 1.0 0.0)))
(def a (clojure.core/concat 
       (->Unit 1.0 0.0) (clojure.core/list 
                           (clojure.core/name (quote a)))))
neurals.core> 

我想了 :

(def a (->Unit 1.0 0.0 (clojure.core/name (quote a))))

concat内部执行的正确方法是什么

xsc

您可以通过删除&in来修复代码create-unit1

(defmacro create-unit1 [var-name body]
  `(def ~var-name ~(concat body (list (name var-name)))))

(macroexpand `(create-unit1 a (->Unit 1.0 1.0)))
;; => (def user/a (user/->Unit 1.0 1.0 "a"))

您还可以添加一些语法糖:

(defmacro create-unit1 [var-name body]
  `(def ~var-name (~@body ~(name var-name))))

或者,使所有这些更加惯用:

(defmacro defunit [sym value gradient]
  `(def ~sym (->Unit ~value ~gradient ~(name sym))))

(defunit a 1.0 1.0)
;; => #user.Unit{:value 1.0, :gradient 1.0, :name "a"}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

clojure源代码在宏中的位置

来自分类Dev

在Clojure中嵌套宏

来自分类Dev

Clojure中的函数定义宏

来自分类Dev

Clojure中的评估和宏

来自分类Dev

Clojure宏可从文件“插入”代码

来自分类Dev

Clojure宏可从文件“插入”代码

来自分类Dev

C中的宏执行步骤

来自分类Dev

如何从Clojure中的map宏获取宏中的参数?

来自分类Dev

如何从Clojure中的map宏获取宏中的参数?

来自分类Dev

从代码中调用Outlook宏

来自分类Dev

android代码中的Java宏

来自分类Dev

hax 中的代码替换宏?

来自分类Dev

我可以从Clojure的宏中引用宏吗?

来自分类Dev

在宏中展开宏

来自分类Dev

在宏中展开宏

来自分类Dev

Clojure中的惯用`and`和`or`函数(不是宏)

来自分类Dev

在Clojure中实现方案样式宏

来自分类Dev

如何在Clojure宏中包装异常?

来自分类Dev

在Clojure宏中访问参数的元数据

来自分类Dev

如何在Clojure宏中绑定变量?

来自分类Dev

在Clojure宏中评估符号的正确方法

来自分类Dev

在Clojure中编写infix宏的问题

来自分类Dev

在Clojure宏中评估符号的正确方法

来自分类Dev

如何在Clojure宏中绑定变量?

来自分类Dev

在 clojure 宏中调用特殊形式“set!”

来自分类Dev

宏执行循环直到在sas中

来自分类Dev

SAS无法在宏执行中解释符号“≤”?

来自分类Dev

在 c 宏中执行算术运算

来自分类Dev

Clojure的喜悦,宏