Pregunta

I have a let statement in which I would like to dynamically destructure a list. The following is my solution:

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]
  ...)

An example value of symList would be ("pt1" "pt2") and an example value of valList would be (1 2)

However, this produces an exception that the first part is an "unsupported binding form". I suspect I am missing something regarding syntax-quoting, or that it's not possible. Any advice would be greatly appreciated.

EDIT: I will only know these values come run time, hence this approach. Secondly, I need to be able to pass the lexical scope later on, hence the use of let.

¿Fue útil?

Solución

If symList and valList have the correct value at compilation time, then you could write a macro to do this. If they are only known at runtime, you are going to have to use/write a function to do the destructuring for you and return the result of that destructuring as some data structure.

In the second case, for something simple like this, you can use (zipmap symList valList) to get a map.

Otros consejos

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

The error you are getting is because your let statement was backwards (let [val SOURCE] STUFF)

maybe matchure can give you what you want

Although I've been unable to find a way to dynamically destructure a list, for those of you who are interested in creating values that are lexically instead of dynamically scoped, I found that intern to whatever namespace you need works well.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top