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.

有帮助吗?

解决方案

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.

其他提示

(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.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top