Tôi đã nhìn thấy khá fewmentions gần đây của "ảo hóa" mẫu đối sánh mới cho scala. Tôi đã bỏ lỡ ghi nhớ giải thích những gì nó thực sự là ...Trình ghép mẫu ảo thử nghiệm của scala là gì?
Trả lời
Các "ảo" Mẫu trình khớp là một viết lại của khớp hiện có. Động lực để thực hiện điều này là hỗ trợ ảo hóa kết hợp mẫu cho các DSL nhúng đa hình, không liên quan đến 2,10.
Như Iulian nói trong các ý kiến dưới đây: Nó rất giống với cách cho-comprehensions được biên soạn: thay vì trực tiếp tạo mã, họ được dịch sang foreach
, map
, filter
, vv mẫu phù hợp có thể sau đó được dịch sang một loạt của các cuộc gọi phương thức, các DSL đó có thể ghi đè lên. Việc thực hiện mặc định sẽ tôn trọng ngữ nghĩa hiện tại và thách thức là làm cho nó hiệu quả như hiện tại. Có vẻ như Adriaan rất gần với mục tiêu này. Việc triển khai 'ảo hóa' đơn giản hơn và sửa một số lỗi trong quá trình triển khai hiện tại.
"DSL đa hình nhúng" là ý tưởng rằng người ta có thể viết chương trình trong scala không được phép chạy trên JVM. Tức là, scalac
sẽ tạo ra một đầu ra mô tả những gì chương trình đang làm. Điều này sau đó có thể được biên dịch lại dựa trên một kiến trúc cụ thể. Những thứ như vậy have been talked about at ScalaDays 2011.
Việc viết lại này cuối cùng sẽ trở thành đối sánh mẫu scala chuẩn. Mẫu phù hợp cũ là (như tôi hiểu nó) không thể duy trì.
Tôi không chắc chắn rằng "trình ghép mẫu ảo là để hỗ trợ ảo hóa khớp mẫu" không phải là điều tôi không thể đoán được. Có lẽ bạn có thể giải thích những gì phù hợp với mô hình ảo hóa thực sự là? –
Nó rất giống với cách biên dịch được biên dịch: thay vì tạo mã trực tiếp, chúng được dịch thành 'foreach',' map', 'filter', vv. có thể ghi đè lên. Việc thực hiện mặc định sẽ tôn trọng ngữ nghĩa hiện tại và thách thức là làm cho nó hiệu quả như hiện tại. Có vẻ như Adriaan rất gần với mục tiêu này. Việc triển khai 'ảo hóa' đơn giản hơn và sửa một số lỗi trong quá trình triển khai hiện tại. –
Xin chào Iulian - nếu chỉ tôi mới có thể trao giải "câu trả lời được chấp nhận" cho bình luận của bạn! –
Đáng buồn thay, câu trả lời hiện có (duy nhất) thấp về các bit ngon ngọt và các liên kết trên bình luận bị hỏng. Vì vậy, hãy để tôi cố gắng thêm một ít nước vào đây, vì nếu không có lý do nào khác, tham chiếu của riêng tôi khi tôi thực sự quyết định làm điều gì đó với nó trong tương lai, xem câu trả lời này nằm trên đầu mỗi tìm kiếm google tôi làm.
Trình so khớp mẫu ảo hóa, như đã đề cập, được viết lại cách trình biên dịch Scala xử lý đối sánh mẫu. Nó phục vụ nhiều mục đích, với phần "ảo hóa" của nó có nghĩa là nó là một phần của nỗ lực scala ảo hóa. Nỗ lực đó hơi ngược lại với các macro: nó lấy những thứ "chạy" tại thời gian biên dịch, và di chuyển sau đó để chạy thời gian.
Ví dụ, với sự hiện diện của định nghĩa thích hợp trong phạm vi, một tuyên bố như thế này:
if (false) 1 else 2
thay vì được biên soạn cho các chi nhánh và literals bytecode, hoặc thậm chí tối ưu hóa để các literal "2", trên thực tế được biên soạn như tuyên bố sau:
__ifThenElse(false, 1, 2)
Hãy xem scala virtualized wiki để biết thêm thông tin và một số ví dụ về điều này có thể hữu ích cho.
Tôi đã nói, tuy nhiên, trình ghép mẫu khớp được phục vụ cho nhiều mục đích. Một mục tiêu rất quan trọng khác là biến mã spaghetti là mẫu matcher cũ, đầy đủ hoặc đặc biệt và góc trường hợp và lỗi, thành một cái gì đó có thể được lý luận, mở rộng và cải thiện dễ dàng hơn. Điều này viết lại cố định rất nhiều vấn đề mà mọi người chỉ cần đi qua các danh sách các vấn đề chạy mã mẫu cho các vấn đề liên quan đến phù hợp với mô hình và đánh dấu các vấn đề là "cố định" khi họ làm việc. Nó có lỗi mới của riêng nó, nhưng trên một quy mô nhỏ hơn nhiều.
Hiện tại, có rất ít thông tin về cách trình ghép mẫu mới hoạt động, nhưng về cơ bản, nó chuyển thành một vài cuộc gọi phương thức được "triển khai" trong trình biên dịch với đơn lẻ Option
. Điều đó sau đó đi vào một giai đoạn tối ưu hóa sản xuất bytecode tối ưu.
Có thể giới thiệu trình kết nối của riêng bạn, mặc dù nó bị khóa phía sau cờ -Xexperimental
. Hãy thử đoạn mã sau, sao chép từ bộ kiểm tra của Scala, có và không có cờ rằng:
trait Intf {
type Rep[+T]
type M[+T] = Rep[Maybe[T]]
val __match: Matcher
abstract class Matcher {
// runs the matcher on the given input
def runOrElse[T, U](in: Rep[T])(matcher: Rep[T] => M[U]): Rep[U]
def zero: M[Nothing]
def one[T](x: Rep[T]): M[T]
def guard[T](cond: Rep[Boolean], then: => Rep[T]): M[T]
def isSuccess[T, U](x: Rep[T])(f: Rep[T] => M[U]): Rep[Boolean] // used for isDefinedAt
}
abstract class Maybe[+A] {
def flatMap[B](f: Rep[A] => M[B]): M[B]
def orElse[B >: A](alternative: => M[B]): M[B]
}
implicit def proxyMaybe[A](m: M[A]): Maybe[A]
implicit def repInt(x: Int): Rep[Int]
implicit def repBoolean(x: Boolean): Rep[Boolean]
implicit def repString(x: String): Rep[String]
def test = 7 match { case 5 => "foo" case _ => "bar" }
}
trait Impl extends Intf {
type Rep[+T] = String
object __match extends Matcher {
def runOrElse[T, U](in: Rep[T])(matcher: Rep[T] => M[U]): Rep[U] = ("runOrElse("+ in +", ?" + matcher("?") + ")")
def zero: M[Nothing] = "zero"
def one[T](x: Rep[T]): M[T] = "one("+x.toString+")"
def guard[T](cond: Rep[Boolean], then: => Rep[T]): M[T] = "guard("+cond+","+then+")"
def isSuccess[T, U](x: Rep[T])(f: Rep[T] => M[U]): Rep[Boolean] = ("isSuccess("+x+", ?" + f("?") + ")")
}
implicit def proxyMaybe[A](m: M[A]): Maybe[A] = new Maybe[A] {
def flatMap[B](f: Rep[A] => M[B]): M[B] = m + ".flatMap(? =>"+ f("?") +")"
def orElse[B >: A](alternative: => M[B]): M[B] = m + ".orElse("+ alternative +")"
}
def repInt(x: Int): Rep[Int] = x.toString
def repBoolean(x: Boolean): Rep[Boolean] = x.toString
def repString(x: String): Rep[String] = x
}
object Test extends Impl with Intf with App {
println(test)
}
Kết quả mà không có cờ chỉ là những gì bạn mong muốn:
scala> Test.main(null)
bar
Với -Xexperimental
, tuy nhiên, thay thế phù hợp với "động cơ" được biên soạn:
scala> Test.main(null)
runOrElse(7, ?guard(false,?).flatMap(? =>one(foo)).orElse(one(bar)))
Xem thêm, để biết thêm thông tin, scaladocs cho PatternMatching và MatchMonadInterface.
Tuyên bố từ chối trách nhiệm: phần trên được trích xuất và chạy từ phiên bản Scala trên nhánh chính, sau 2.10.0, do đó có thể có sự khác biệt. Tôi thấy mình buồn bã thiếu trong một môi trường 2.10.0 hoặc 2.10.1 tinh khiết để kiểm tra nó ra, mặc dù.
- 1. Thử nghiệm khói là gì?
- 2. Các trường hợp sử dụng cho thử nghiệm của Scala 2.9 ... bắt tổng quát là gì?
- 3. Thử nghiệm lập trình
- 4. Mở rộng mẫu thử nghiệm
- 5. Cách chính xác để mô phỏng đệ quy để thử nghiệm một biểu mẫu là gì?
- 6. Mục đích của ngôn ngữ lập trình Scala là gì?
- 7. Á hậu thử nghiệm Nunit tốt nhất là gì?
- 8. Khung thử nghiệm đơn vị sinh học là gì?
- 9. Mẫu C++ thử nghiệm đơn vị
- 10. Khi nào thì vùng thử nghiệm tệp thử nghiệm Python của tôi không phải là 100%?
- 11. Scala thử nghiệm mocking tham số ngầm định?
- 12. Lợi ích của Scala là gì?
- 13. Tôi cần thử nghiệm ứng dụng của mình trên các thiết bị ảo khác nhau
- 14. Thử nghiệm đơn vị và thử nghiệm tích hợp là gì và tôi nên biết những loại thử nghiệm nào khác?
- 15. Máy ảo (ảo) có sẵn miễn phí để thử nghiệm nguồn mở?
- 16. Thử nghiệm đơn vị diễn viên Akka với Scala
- 17. Cách ưa thích của bạn trong việc thử nghiệm đoạn mã javascript là gì?
- 18. Thử nghiệm tương thích trình duyệt
- 19. OptManifest và NoManifest của Scala là gì?
- 20. "Thử" của Scala có nghĩa là gì nếu không bị bắt hoặc chặn cuối cùng?
- 21. Trải nghiệm Devtrack của bạn là gì?
- 22. Điều gì có nghĩa là thử nghiệm A/B của một trang web?
- 23. Dòng đầu tiên của tập lệnh thử nghiệm Perl (.t) là gì?
- 24. Tỷ lệ tốt của nhà phát triển cho người thử nghiệm là gì?
- 25. Cạm bẫy của thử nghiệm sau khi phát triển là gì?
- 26. Thử nghiệm khói thuốc là gì và tôi sẽ làm gì?
- 27. Có bao nhiêu thử nghiệm là đủ?
- 28. Trình biên dịch mẫu javascript là gì?
- 29. Sao chép mẫu thử nghiệm để kế thừa?
- 30. Cơ sở dữ liệu thử nghiệm Django trông trống trong khi thử nghiệm là runnin
Tôi chưa bao giờ nghe nói có một điều như vậy – wheaties