4

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

4 回答 4

2

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

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

于 2010-07-12T18:02:50.523 回答
0
(let [valList (map str symList)]
   (somefun valList))

您得到的错误是因为您的 let 语句是向后的(let [val SOURCE] STUFF)

于 2010-07-12T17:55:56.987 回答
0

也许match可以给你你想要的

于 2010-07-13T05:34:53.893 回答
0

虽然我一直无法找到动态解构列表的方法,但对于那些有兴趣创建词法而不是动态范围的值的人,我发现intern无论你需要什么命名空间都可以很好地工作。

于 2010-07-14T11:51:15.077 回答