Clojure元编程动态选择记录(初学者!)

标签 clojure metaprogramming

我有一堆实现协议(protocol) P 的记录 (A B C)。

我想编写一个方法,该方法将选择一种记录类型,构造它,然后调用它的方法。

例如,如果我有一个记录列表 (def types '(A B C)) 我想做类似 (->(first types) 1 2 3)

最佳答案

嗯,函数也是值,可以在数据结构中存储和检索。因此,您应该能够以某种方便的格式存储您想要从中选择的构造函数并从那里使用它们。类似于:

(defrecord foo [x y])

(defrecord bar [x y z])

(def constructors [->foo ->bar])

((first constructors) 4 5) ;;=> #user.foo{:x 4, :y 5}

;;or

(apply (second constructors) [20 true :baz]) ;;=> #user.bar{:x 20, :y true, :z :baz}

(-> (second constructors) (apply '(59 -30 false))) ;;=> #user.bar{:x 59, :y -30, :z false}

或者您甚至可以完全跳过数据结构:

(defn quxx [n a-map]
  ((if (< 25 n) map->foo map->bar) a-map))

(quxx 2 {:x 3 :y 9 :z -200}) ;;=> #user.bar{:x 3, :y 9, :z -200}

(quxx 29 {:x 3 :y 9 :z -200}) ;;=> #user.foo{:x 3, :y 9, :z -200}

关于Clojure元编程动态选择记录(初学者!),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29712173/

相关文章:

clojure - clojure 中通常的命名规则是什么?

clojure - 如何在 Clojure 中获取参数名称?

java - 如果我想用 clojure 开发一个独立的 jar,应该把要处理的文件放在哪里?

scala - 编译时类型跟踪

python - 使用 type() 手动创建新类时,子类 __module__ 设置为元类模块

c++ - 将结构拆分为元组

c++ - 已知类集中的反射

clojure - 自动刷新/自动重新加载资源

Clojure 深度合并忽略 nil 值

ruby - 在 Ruby 的 DSL 中使用 procs