动态让Clojure中的列表解构

时间:2010-07-12 17:29:54

标签: syntax clojure list eval destructuring

我有一个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 个答案:

答案 0 :(得分:2)

如果symList和valList在编译时具有正确的值 ,那么您可以编写一个宏来执行此操作。如果只在运行时知道它们,那么您将不得不使用/编写一个函数来为您进行解构,并将该解构的结果作为一些数据结构返回。

在第二种情况下,对于像这样的简单内容,您可以使用(zipmap symList valList)来获取地图。

答案 1 :(得分:0)

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

你得到的错误是因为你的let语句是倒退的(让[val SOURCE] STUFF)

答案 2 :(得分:0)

也许matchure可以为您提供您想要的东西

答案 3 :(得分:0)

虽然我一直无法找到动态解构列表的方法,但对于那些有兴趣创建词法而不是动态范围的值的人,我发现intern到你需要的任何命名空间效果很好。