2010-01-07 33 views
5

Tôi đang tìm các cách tiếp cận khác nhau để hỗ trợ một số mức độ intelliSense trên một ngôn ngữ được gõ động. Vì thông tin intellisense dựa trên thông tin kiểu, có những khó khăn cố hữu trong việc thực hiện điều này cho các ngôn ngữ động.Intellisense cho các ngôn ngữ động

Bạn có biết bất kỳ thuật toán hoặc phương pháp nào để triển khai không?

Trả lời

7

Bạn cần phải viết một trừu tượng thông dịch viên thực thi mã với các giá trị kiểu. Vì vậy, bạn bước với trình thông dịch trừu tượng của bạn máng AST và ghi lại cho mỗi biến các tin nhắn được gửi hoặc các loại đã biết. Và khi bạn hoàn thành, bạn suy ra các loại có thể bằng cách sử dụng kiểu tương đương về cấu trúc (còn gọi là gõ vịt).

PS:ngoài gõ suy luận bạn có thể muốn có một cái nhìn tại "How Program History Can Improve Code Completion" by Romain Robbes, là giải thích làm thế nào để cải thiện hơn nữa hoàn thành tự động bằng các ngôn ngữ năng động với các thông tin gần đây nhất được sử dụng và lọc cộng tác.

Vì vậy, đây là cách trừu tượng giải thích làm việc cho một đoạn mã như

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 

bạn sẽ bắt đầu với

array = { :messages => [], :types => [] } 
block = { :messages => [], :types => [] } 

và sau đó

array = { :messages => [], :types => [] } 
block = { :messages => [], :types => [] } 
groups = { :messages => [], :types => [Hash] } 

và sau đó

array = { :messages => [:each], :types => [] } 
block = { :messages => [], :types => [] } 
groups = { :messages => [], :types => [Hash] } 

và sau đó

array = { :messages => [:each], :types => [] } 
block = { :messages => [:call], :types => [] } 
groups = { :messages => [], :types => [Hash] } 
key = { :messages => [], :types => [] } 

và sau đó

array = { :messages => [:each], :types => [] } 
block = { :messages => [:call], :types => [] } 
groups = { :messages => [:include?,:[]], :types => [Hash] } 
group_elements = { :messages => [], :types => [Array] } 
key = { :messages => [], :types => [] } 

và sau đó

array = { :messages => [:each], :types => [] } 
block = { :messages => [:call], :types => [] } 
groups = { :messages => [:include?,:[]], :types => [Hash] } 
group_elements = { :messages => [:<<], :types => [Array] } 
key = { :messages => [], :types => [] } 

vậy cuối cùng chúng ta có thể suy ra rằng

  • array có thể là một Enumerable
  • block có thể là một Proc
  • groups là một Hash với Array yếu tố
  • key là bất kỳ đối tượng
0

Dễ dàng, chỉ cần thêm một bước bổ sung - type inference. Sau đó bạn biết nhập thông tin và có thể gợi ý điều gì đó cho người dùng.

+0

Thực ra, tôi đang hỏi về cách làm loại inferene cho động ngôn ngữ đã nhập. – user101375

0

Lưu ý rằng "ngôn ngữ động" và "ngôn ngữ được nhập động" không nhất thiết phải giống nhau.

Cách mà Microsoft xử lý điều này trong intellisense cho Javascript (VS2008) là nó xâm nhập, với khả năng tốt nhất của nó, loại var hiện đang nắm giữ. Nếu/khi điều này thay đổi, các tham chiếu sau đây đến var sẽ hiển thị các tùy chọn cho kiểu được cập nhật.

1

tôi sẽ tải về các nguồn của Groovy plugin cho Eclipse, nó có IntelliSense (càng nhiều càng tốt), và nghĩ Groovy là một mẫu tốt của một ngôn ngữ dyanamic với động gõ

Các vấn đề liên quan