2010-07-12 3 views
4

У меня есть оператор let, в котором я хотел бы динамически разрушить список. Следующее мое решение:Dynamic let List Destructuring in 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)

Тем не менее, это производит исключение, что первая часть является «неподдерживаемый связывания формы ». Я подозреваю, что у меня что-то не хватает в отношении цитирования синтаксиса или что это невозможно. Любые советы будут очень признательны.

EDIT: Я буду знать, что эти значения приходят в рабочее время, следовательно, этот подход. Во-вторых, я должен иметь возможность передать лексический охват позже, следовательно, использовать let.

+1

Мне интересно узнать, возможно ли это; это кажется сомнительным, но я не эксперт. – Pointy

ответ

2

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

Во втором случае, для чего-то простого подобного, вы можете использовать (zipmap symList valList), чтобы получить карту.

+0

Я так много вычислил и уже написал функцию для этого, так как значения не будут известны до времени выполнения. Проблема в том, что мне нужно затем передать лексическую область в другом месте (с этими значениями, привязанными к их символам), что невозможно сделать с помощью 'def' (я верю - пожалуйста, исправьте меня, если я ошибаюсь). Есть ли способ сделать деструктурирование с помощью zipmap и все еще определить его в 'let'? –

+2

Лексически вы не можете этого сделать (если целевой код не является кодом, и вы хотите построить код, который вы передадите на eval). Тем не менее динамический охват выполнен. Если symList был списком vars, и цель была написана для использования этих vars, вы могли бы использовать clojure.core/with-bindings, чтобы делать то, что вы хотите. Возможно, это лучшее решение проблемы, которую вы пытаетесь решить с помощью этого подхода. – Brian

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

ошибка вы получаете, потому что ваш пусть заявление было в обратном направлении (пусть [Вэл SOURCE] STUFF)

+0

Я думал, что 'let' работал так, что это было (значение символа). Поэтому в этом случае я хотел бы иметь возможность ссылаться на символ pt1 и получать 1, pt2 и получать 2 и т. Д. –

+0

(пусть [pt1 1 pt2 2] (println pt1)) будет печатать 1 через stdout. –

0

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

+0

Я проверил это, но я не мог найти ничего, что могло бы это сделать, хотя это классная библиотека. –

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^