2016-04-24 38 views
3

在其他语言中,如何创建一个结构是非常明显的。你如何在Clojure中做这样的事情?Clojure - 为某人定义数据结构

例如,我想添加一个人的姓名,地址和电话号码(家庭和手机)。

我猜我想做一个向量?

在此先感谢!

回答

7

在Clojure中,你通常会用一个图来表示这种类型的数据。你可以使用一个平面地图:

{:first-name "Jeremy" 
:last-name "Martinson" 
:street "455 Larkspur Dr." 
:city "Baviera" 
:state "California" 
:zip 22611 
:home-phone "(555) 555-5555" 
:mobile-phone "(666) 666-6666"} 

或者嵌套一个:

{:name {:first "Jeremy" 
     :last "Martinson"} 
:address {:street "455 Larkspur Dr." 
      :city "Baviera" 
      :state "California" 
      :zip 22611} 
:phones {:home "(555) 555-5555" 
      :mobile "(666) 666-6666"}} 

如果你的数据有更多或更少的静态模式,你想利用Clojure's polymorphic features,你可以使用records

(defrecord Name [first last]) 

(defrecord Address [street city state zip]) 

(defrecord Phones [home mobile]) 

(defrecord Person [name address phones]) 

(map->Person 
{:name (map->Name 
     {:first "Jeremy" 
      :last "Martinson"}) 
    :address (map->Address 
      {:street "455 Larkspur Dr." 
      :city "Baviera" 
      :state "California" 
      :zip 22611}) 
    :phones (map->Phones 
      {:home "(555) 555-5555" 
      :mobile "(666) 666-6666"})}) 

在这种情况下,然而,你可能想只用一张地图去。记录,特别是,相当难看。

+0

事实上,电话有点在选项3的“丑陋”一面。第一个选项是伟大的,因为它非常简单,但嵌套选项可能是我想要的更多一点。这看起来非常干净简洁 - 将所有内容都保存为几乎像表格一样的格式。这样我就可以一次拖出所有特定类型的数据......我的意思是个人信息,地址和电话。 非常感谢你 - 我非常感谢你的EXTREMELY CLEAR阐述。 – FoxDonut

2

Clojure中它被称为“记录”,并使用defrecord定义: 从文档:

(defrecord Person [fname lname address]) 
-> user.Person 

(defrecord Address [street city state zip]) 
-> user.Address 

(def stu (Person. "Stu" "Halloway" 
      (Address. "200 N Mangum" 
         "Durham" 
         "NC" 
         27701))) 
-> #'user/stu 

(:lname stu) 
-> "Halloway" 

(-> stu :address :city) 
-> "Durham"