我想在Clojure中将变量的名称作为字符串.但是,与此问题不同,我会得到原始绑定的名称(不确定术语是否正确,所以请参阅下面的示例).
(def sample-data1 {:data 1})
(def sample-data2 {:data 2})
(def sample-data3 {:data 3})
(doseq
[my-var [sample-data1 sample-data2 sample-data3]]
(println (name 'my-var)))
Run Code Online (Sandbox Code Playgroud)
在这种情况下,而不是打印
my-var
my-var
my-var
Run Code Online (Sandbox Code Playgroud)
我想拥有 :
sample-data1
sample-data2
sample-data3
Run Code Online (Sandbox Code Playgroud)
我怎么在Clojure中做到这一点?
注意:这可能不是真正的应用程序中最漂亮的事情.但我的问题是,如果这是可能的.
澄清一下:这是为了进行原型设计.在这个特定的情况下,而不是打印我填充(postgres)数据库与假数据,我手工编写变量,我想跟踪我的变量最终没有编写太多代码.
def创建一个与名称作为def第一个参数提供的名称相同的var .clojure中的var与我们通常所指的变量不同,而变量通常可以被视为包含值的框,而var是指向值的东西.
从你的例子,(这里,我在user命名空间)
user> (def sample-data1 {:data 1})
#'user/sample-data1
Run Code Online (Sandbox Code Playgroud)
clojure #'user/sample-data1在user名称空间中创建一个指向{:data 1}值的var .您可以通过使用deref或@简写来对其进行反演来从新创建的var中获取值.
user> (deref #'user/sample-data1)
{:data 1}
user> @#'user/sample-data1
{:data 1}
Run Code Online (Sandbox Code Playgroud)
或者如果您评估一个符号,clojure会在当前命名空间中查找var并返回该var指向的值.
user> sample-data1
{:data 1}
Run Code Online (Sandbox Code Playgroud)
您可以通过使用得到一个符号一个变种var的#'简写.
user> (var sample-data1)
#'user/sample-data1
user> #'sample-data1
#'user/sample-data1
Run Code Online (Sandbox Code Playgroud)
所以,你想要var的名字.var的名称包含在var的元数据中,可以使用meta应用于var 来访问它.
user> (meta #'sample-data1)
{:line 1, :column 1, :file "/tmp/form-init3246148490151701909.clj",
:name sample-data1, :ns #object[clojure.lang.Namespace 0x39ba2c26 "user"]}
Run Code Online (Sandbox Code Playgroud)
在上面,您可以看到var的名称是:name按键定位的.
因此,您可以从其元数据中获取var的名称.
user=> (:name (meta #'sample-data1))
sample-data1
Run Code Online (Sandbox Code Playgroud)
我不希望有太多嵌套的括号,所以我使用线程优先的宏 ->
user=> (-> #'sample-data1 meta :name)
sample-data1
Run Code Online (Sandbox Code Playgroud)
回到你的问题,你需要sample-data[1-3]vars及其元数据来获取他们的名字.
(def sample-data1 {:data 1})
(def sample-data2 {:data 2})
(def sample-data3 {:data 3})
(doseq
[my-var [#'sample-data1 (var sample-data2) #'sample-data3]]
(println (-> my-var meta :name)))
Run Code Online (Sandbox Code Playgroud)
结果是
sample-data1
sample-data2
sample-data3
nil
Run Code Online (Sandbox Code Playgroud)