【问题标题】:JavaScript Map shadowingJavaScript 地图阴影
【发布时间】:2017-04-08 16:52:27
【问题描述】:

用 JavaScript 编写解析器,对于任何语言,显然都使用 Map 来存储名称到变量的映射。

大多数语言都允许以某种方式或另一个变量在内部范围内隐藏外部范围内的变量。实现这一点的理想数据结构是功能映射。如果没有这个,似乎有两种选择。

  1. 将 Map 视为功能映射,创建外部映射的副本,将内部变量添加到副本中,当内部范围结束时将其作为垃圾回收。这很优雅,但每次都花费 O(N) 时间复制现有变量,因此如果在给定点存在许多变量,则可能会很慢。

  2. 采用完整的命令式样式,只需使用单个映射,保存旧绑定并在内部范围的末尾恢复它。这速度很快,但不优雅且容易出错。

还有更好的选择吗?是否就哪个选项最好达成共识?

【问题讨论】:

  • "显然使用 Map 来存储名称到变量的映射。" - 为什么?
  • 你在写解析器还是解释器?解析器不需要存储实际变量。
  • @Bergi 好吧,现在我正在为 TPTP 文件格式编写一个解析器,它确实需要存储实际变量。

标签: javascript dictionary lexical-scope


【解决方案1】:

使用Map 对象的链表来表示范围。如果在第一个链接中没有找到标识符,则递归遍历其余部分,直到全局范围。

【讨论】:

  • 对,这是一个选项;它相当于创建一个具有线性时间查找的简单功能地图类,如果有很多变量,它又可能会变慢。
  • 是的,基本上就是这样。然而,它确实比线性范围更好地处理具有许多变量的范围,并且链链接的数量通常是有限的,因为在编写良好的程序中不会无限地嵌套(范围)块。所以总的来说,我仍然希望O(1) 访问。
  • 为了以防万一,如果您需要更好的性能,您可以通过向下迁移查找结果(假设范围是静态的并且您在映射中存储变量引用而不是值)来相对轻松地优化它当它们被访问但丢失时链接(即懒惰地复制条目),同时保持你的数据结构透明。
  • 对。我最终将一个简单的版本放入具有其他一些通用实用程序功能的包中:npmjs.com/package/iop
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多