如何从变量或函数中获取名称字符串?

nha*_*nha 0 clojure

我想在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)数据库与假数据,我手工编写变量,我想跟踪我的变量最终没有编写太多代码.

mav*_*ozo 6

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-data1user名称空间中创建一个指向{: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)