Динамический пусть список уничтожается в Clojure - PullRequest
4 голосов
/ 12 июля 2010

У меня есть оператор let, в котором я хотел бы динамически деструктурировать список.Вот мое решение:

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.

Ответы [ 4 ]

2 голосов
/ 12 июля 2010

Если symList и valList имеют правильное значение во время компиляции , то вы можете написать макрос для этого.Если они известны только во время выполнения, вам придется использовать / написать функцию, чтобы выполнить деструктуризацию за вас, и вернуть результат этой деструктуризации как некоторую структуру данных.просто, как это, вы можете использовать (zipmap symList valList), чтобы получить карту.

0 голосов
/ 14 июля 2010

Хотя я не смог найти способ динамической деструкции списка, для тех из вас, кто заинтересован в создании значений, которые являются лексическими, а не динамически ограниченными, я обнаружил, что intern для любого пространства имен, которое вам необходимо .

0 голосов
/ 13 июля 2010

возможно матчюр может дать вам то, что вы хотите

0 голосов
/ 12 июля 2010
(let [valList (map str symList)]
   (somefun valList))

Ошибка, которую вы получаете, потому что ваш оператор let был задом наперед (let [val SOURCE] STUFF)

...