2013-02-04 24 views
12

Quay lại khi phản chiếu vẫn còn tồn tại, vào những ngày của mốc Scala 2.10.0, tôi asked a question về cách tôi có thể sử dụng nó để xem các cây đoạn mã từ REPL. Câu trả lời xuất sắc đi xa hơn tôi hỏi, và cho thấy cách chúng có thể được sử dụng để phân tích và đánh giá cây, vì vậy tôi đã tiếp tục và cố gắng sử dụng nó trên một dự án nhỏ mà tôi đã thực hiện ngày hôm nay.Làm cách nào để có được Hộp công cụ Scala để xem định nghĩa REPL?

Thật không may, mã phân tích và đánh giá như vậy dường như không nhìn thấy bất kỳ định nghĩa REPL:

scala> val x = 1 
x: Int = 1 

scala> import scala.tools.reflect.ToolBox 
import scala.tools.reflect.ToolBox 

scala> val tb = scala.reflect.runtime.universe.runtimeMirror(
    getClass.getClassLoader).mkToolBox() 
tb: scala.tools.reflect.ToolBox[reflect.runtime.universe.type] = ... 

scala> tb.eval(tb.parse("x")) 
scala.tools.reflect.ToolBoxError: reflective compilation has failed: 

not found: value x 

Có cách nào để làm cho nó nhận ra định nghĩa được thực hiện trên REPL?

+0

Trái ngược với không có trong REPL? Tôi đã viết chính xác cùng một mã (https://gist.github.com/jedesah/5812481) trong một dự án sbt và tôi nhận được hành vi tương tự như trong REPL. Nếu đây là cách ToolBox hoạt động trong một số bối cảnh khác, tôi rất tò mò muốn biết. – jedesah

+0

@UndercoverAgent Code trong hộp công cụ có quyền truy cập vào bất kỳ thứ gì bạn có thể truy cập từ "root" - nếu không nó sẽ khá vô ích. Trong trường hợp bạn đã cho thấy, biến đó không có sẵn ở "root". –

+0

Vô dụng là một từ mạnh mẽ, nó có thể được sử dụng để đánh giá các cây tự chứa. Trong mọi trường hợp, dự án nhỏ này bạn đang/đang làm việc, nó có phải là nguồn mở không? Tôi rất thích nhìn thấy một ví dụ về việc truy cập các định nghĩa bên ngoài (từ chính cây), tôi không chắc chắn chính xác những gì bạn muốn nói bằng cách tiếp cận chúng từ "gốc". – jedesah

Trả lời

6

Gần đây tôi đào vào repl, khi cố gắng làm cho nó hỗ trợ loại macro, vì vậy tôi được trang bị tốt để giải thích lý do tại sao nó không hoạt động. Bắt nó để làm việc sẽ là bước tiếp theo :)

Tôi biết rằng bạn biết rằng mọi đoạn mã được nhập vào repl được đưa vào một số bản mẫu trước khi được biên soạn. Do đó x kết thúc là một trường trong một đối tượng lồng nhau lồng nhau trong một gói có tên lạ.

Rõ ràng, repl theo dõi tất cả các ký hiệu được xác định và sau đó tiêm các mục nhập cần thiết cùng với bản mẫu mà nó tạo ra. Do đó các dòng tiếp theo có thể thấy rằng x không đủ điều kiện. Ngược lại, các hộp công cụ đơn giản sử dụng lại trình nạp lớp của repl, nhưng không làm bất cứ điều gì về việc nhập khẩu, do đó thất bại.

Cách giải quyết sẽ bằng cách nào đó nhận được đối tượng đại diện cho repl, hỏi về ký hiệu đã xác định và sau đó tạo các nhập tương ứng vào mã mà bạn cấp cho hộp công cụ. Nếu bạn nộp một vé, tôi sẽ cố gắng để mã hóa một workaround sau khi mã 2.10.1 đóng băng điên rồ kết thúc (được cho là, cuối tuần này).

+0

[SI-7081] (https://issues.scala-lang.org/browse/SI-7081) –

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