Để phản hồi lại this question, tôi đã có một bước tiến triển khai biểu thức kiểu Haskell 'where' ở Scala bằng cách sử dụng nhánh thiên đường vĩ mô. Mã có sẵn tại scala-where. bây giờ tôi có thể viết một cái gì đó như sau:Scala untyped macro ở vị trí infix
val result = where (f1(1) * f2(2), {
def f1(x : Int) = x + 1
def f2(x : Int) = x + 2
})
Tuy nhiên, những gì tôi thực sự muốn làm là để có thể gọi đây là ở vị trí trung tố:
val result = (f1(1) * f2(2)) where {
def f1(x : Int) = x + 1
def f2(x : Int) = x + 2
}
Thông thường, các loại điều này sẽ dễ dàng, nhưng tôi không thể thấy cách thực hiện nó bằng cuộc gọi macro. Biểu thức (f1 (1) * f2 (2)) sẽ không gõ trước ứng dụng macro, vì vậy một cái gì đó như xây dựng một lớp giá trị tiềm ẩn không hoạt động. Có cách nào để nhận cú pháp kiểu này không?
Không này, chỉ có hai danh sách tham số để người ta có thể làm:
val result = where (f1(1) * f2(2)) {
def f1(x : Int) = x + 1
def f2(x : Int) = x + 2
}
sẽ được tốt đẹp, nhưng một lần nữa điều này dường như khó khăn. Có thể gọi một macro với hai danh sách tham số không?
Hai tham số điều là rất tốt, cảm ơn! Tôi bằng cách nào đó đã bỏ lỡ điều đó. – Impredicative
Liên quan đến việc chuyển đổi tiềm ẩn - Tôi không chắc chắn làm thế nào để có được móc vào hệ thống vĩ mô. Tôi không nghĩ rằng nó có thể là một chuyển đổi tiềm ẩn, vì chắc chắn cây phải được đánh máy để tìm kiếm các chuyển đổi? – Impredicative
Bạn có thể đúng, mặc dù tôi nghĩ bạn sẽ có thể thực hiện 'ngầm định def conv = macro conv_impl; def conv_impl (c: Bối cảnh) (x: c.Tree): c.Expr [T] 'và về cơ bản nó thuộc kiểu' Any => T' –