动态语言的智能感知

use*_*375 5 intellisense programming-languages

我正在寻找各种方法来支持动态类型语言的某种级别的智能感知.由于智能感知信息基于类型信息,因此在动态语言中实现这一点存在固有的困难.

你知道实现它的算法或方法吗?

aku*_*uhn 7

您需要编写一个抽象解释器来执行带有类型值的代码.因此,您通过AST逐步使用抽象解释器,并为每个变量记录已发送的消息或已知类型.当你完成后,你使用结构类型等价(也就是鸭子打字)来推断可能的类型.

PS: 除了类型推断,你可能想看看Romain Robbes的"程序历史如何改进代码完成",解释了如何使用最近使用的信息和协同过滤进一步改进动态语言的自动完成.

所以这里是抽象解释如何适用于像这样的代码片段

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
Run Code Online (Sandbox Code Playgroud)

你会开始的

array = { :messages => [], :types => [] }
block = { :messages => [], :types => [] }
Run Code Online (Sandbox Code Playgroud)

然后

array = { :messages => [], :types => [] }
block = { :messages => [], :types => [] }
groups = { :messages => [], :types => [Hash] }
Run Code Online (Sandbox Code Playgroud)

然后

array = { :messages => [:each], :types => [] }
block = { :messages => [], :types => [] }
groups = { :messages => [], :types => [Hash] }
Run Code Online (Sandbox Code Playgroud)

然后

array = { :messages => [:each], :types => [] }
block = { :messages => [:call], :types => [] }
groups = { :messages => [], :types => [Hash] }
key = {  :messages => [], :types => [] }
Run Code Online (Sandbox Code Playgroud)

然后

array = { :messages => [:each], :types => [] }
block = { :messages => [:call], :types => [] }
groups = { :messages => [:include?,:[]], :types => [Hash] }
group_elements = { :messages => [], :types => [Array] }
key = { :messages => [], :types => [] }
Run Code Online (Sandbox Code Playgroud)

然后

array = { :messages => [:each], :types => [] }
block = { :messages => [:call], :types => [] }
groups = { :messages => [:include?,:[]], :types => [Hash] }
group_elements = { :messages => [:<<], :types => [Array] }
key = { :messages => [], :types => [] }
Run Code Online (Sandbox Code Playgroud)

所以最终我们可以推断出来

  • array 可能是一个 Enumerable
  • block 可能是一个 Proc
  • groups是一个HashArray元件
  • key 是任何对象