【发布时间】:2015-07-21 23:05:56
【问题描述】:
我正在寻找各种方法来支持动态类型语言的某种程度的智能感知。由于智能感知信息基于类型信息,因此在动态语言中实现这一点存在固有的困难。
你知道实现它的算法或方法吗?
【问题讨论】:
标签: programming-languages intellisense
我正在寻找各种方法来支持动态类型语言的某种程度的智能感知。由于智能感知信息基于类型信息,因此在动态语言中实现这一点存在固有的困难。
你知道实现它的算法或方法吗?
【问题讨论】:
标签: programming-languages intellisense
你需要编写一个抽象解释器来执行带有类型值的代码。因此,您使用抽象解释器通过 AST 并为每个变量记录发送的消息或已知类型。完成后,您可以使用结构类型等价(又名鸭子类型)推断可能的类型。
PS: 除了类型推断之外,您可能还想看看 "How Program History Can Improve Code Completion" by Romain Robbes,它解释了如何使用最近使用的信息进一步改进动态语言中的自动完成和协同过滤。
下面是抽象解释对于类似 sn-p 的代码的工作原理
def groups(array,&block)
groups = Hash.new
array.each { |ea|
key = block.call(ea)
groups[key] = [] unless groups.include? key
groups[key] << ea
}
return groups
end
你会开始
array = { :messages => [], :types => [] }
block = { :messages => [], :types => [] }
然后
array = { :messages => [], :types => [] }
block = { :messages => [], :types => [] }
groups = { :messages => [], :types => [Hash] }
然后
array = { :messages => [:each], :types => [] }
block = { :messages => [], :types => [] }
groups = { :messages => [], :types => [Hash] }
然后
array = { :messages => [:each], :types => [] }
block = { :messages => [:call], :types => [] }
groups = { :messages => [], :types => [Hash] }
key = { :messages => [], :types => [] }
然后
array = { :messages => [:each], :types => [] }
block = { :messages => [:call], :types => [] }
groups = { :messages => [:include?,:[]], :types => [Hash] }
group_elements = { :messages => [], :types => [Array] }
key = { :messages => [], :types => [] }
然后
array = { :messages => [:each], :types => [] }
block = { :messages => [:call], :types => [] }
groups = { :messages => [:include?,:[]], :types => [Hash] }
group_elements = { :messages => [:<<], :types => [Array] }
key = { :messages => [], :types => [] }
所以最终我们可以推断出
array 可能是 Enumerable
block 可能是 Proc
groups 是带有 Array 元素的 Hash
key 是任何对象【讨论】:
我会下载 eclipse 的 Groovy plugin 的源代码,它具有智能感知(尽可能多),并且认为 Groovy 是具有动态类型的动态语言的一个很好的示例
【讨论】:
很简单,只需添加一个额外的步骤 - type inference。之后,您就可以了解类型信息并可以向用户提出建议。
【讨论】:
请注意,“动态语言”和“动态类型语言”不一定是一回事。
Microsoft 在 intellisense for Javascript (VS2008) 中处理此问题的方式是,它尽其所能推断 var 当前拥有的类型。如果/当这种情况发生变化时,对 var 的引用将显示更新类型的选项。
【讨论】: