2010-07-12 47 views
4

我有一個let聲明,我想動態解構一個列表。以下是我的解決方案:Clojure動態允許列表解構

symList ;; list of some Strings which will become the vector of Symbols to assign to 
valList ;; list of some values, same length as symList 

(let [(map read-string symList) valList] 
    ...) 

symList一個實例值將是("pt1" "pt2")valList的示例值將是(1 2)

然而,這產生了不同的是,第一部分是「不支持結合形式」。我懷疑我缺少一些關於語法引用的內容,或者這是不可能的。任何建議將不勝感激。

編輯:我只知道這些值來運行時,因此這種方法。其次,我需要能夠稍後通過詞法範圍,因此使用let

+1

我有興趣看到這是否可能;這似乎令人懷疑,但我不是專家。 – Pointy 2010-07-12 17:52:39

回答

2

如果SYMLIST和valList必須在編譯時正確的值,那麼你可以寫一個宏做這個。如果只在運行時才知道它們,則必須使用/編寫函數來爲您執行解構並將解構的結果作爲某種數據結構返回。

在第二種情況下,對於這樣簡單的事情,您可以使用(zipmap symList valList)來獲取地圖。

+0

我的想法很多,並且已經寫了一個函數來做到這一點,因爲直到運行時纔會知道這些值。問題是我需要將詞法範圍傳遞到其他地方(將這些值綁定到它們的符號),這不能用'def'來完成(我相信 - 如果我錯了,請糾正我)。有沒有辦法使用zipmap進行解構並且仍然在'let'中定義它? – 2010-07-12 18:07:31

+2

詞彙上你不能這樣做(除非目標代碼仍然是代碼,並且你想構建你傳遞給eval的代碼)。儘管動態範圍是可行的。如果symList是一個變量列表,並且目標被編寫爲使用這些變量,那麼可以使用clojure.core/with-bindings來執行你想要的操作。 對於您嘗試使用此方法解決的問題,可能有更好的解決方案。 – Brian 2010-07-12 18:13:06

0
(let [valList (map str symList)] 
    (somefun valList)) 

你所得到的錯誤是因爲你的let語句是向後(讓[VAL SOURCE] STUFF)

+0

我以爲'let'是以這樣的方式工作的(符號值)。因此,在這種情況下,我希望能夠引用符號pt1並獲得1,pt2並獲取2等。 – 2010-07-12 18:02:09

+0

(讓[pt1 1 pt2 2](println pt1))通過stdout打印1。 – 2010-07-12 18:03:53

0

也許matchure可以給你想要的

+0

我檢查了一下,但我似乎無法找到任何可以做到的事情,儘管它是一個很酷的圖書館。 – 2010-07-13 17:21:29

0

什麼。雖然我一直無法找到動態解構列表的方式,對於那些你誰感興趣的創建是詞彙,而不是動態範圍的值,我發現intern不管你需要什麼名字空間都很好。