【问题标题】:Intellisense for dynamic languages用于动态语言的智能感知
【发布时间】:2015-07-21 23:05:56
【问题描述】:

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

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

【问题讨论】:

    标签: programming-languages intellisense


    【解决方案1】:

    你需要编写一个抽象解释器来执行带有类型值的代码。因此,您使用抽象解释器通过 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 是任何对象

    【讨论】:

      【解决方案2】:

      我会下载 eclipse 的 Groovy plugin 的源代码,它具有智能感知(尽可能多),并且认为 Groovy 是具有动态类型的动态语言的一个很好的示例

      【讨论】:

        【解决方案3】:

        很简单,只需添加一个额外的步骤 - type inference。之后,您就可以了解类型信息并可以向用户提出建议。

        【讨论】:

        • 其实我是在问如何为动态类型语言做类型推断。
        【解决方案4】:

        请注意,“动态语言”和“动态类型语言”不一定是一回事。

        Microsoft 在 intellisense for Javascript (VS2008) 中处理此问题的方式是,它尽其所能推断 var 当前拥有的类型。如果/当这种情况发生变化时,对 var 的引用将显示更新类型的选项。

        【讨论】:

          猜你喜欢
          • 2019-01-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-18
          • 2015-10-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多