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