2016-04-24 81 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"