Khi tôi cố gắng xây dựng các DSL nội bộ trong Scala, tôi gặp phải một vấn đề chung và tôi không thể tạo ra một giải pháp. Để làm cho mọi thứ trông hơi giống một ngôn ngữ điển hình, tôi muốn cú pháp trông giống như thế này:Xây dựng một danh sách từ một loạt các biểu thức trong Scala
model 'Foo {
decl 'Real 'x;
decl 'Real 'y;
}
Thực tế, có một số vấn đề. Vấn đề đầu tiên là nhận được một đối tượng model
ở đây để lấy hai đối số theo cách này. Nếu ai có ý tưởng nào, hãy cho tôi biết. Nhưng những gì tôi đã thực hiện thay vì là để làm điều gì đó nhiều hơn một chút như thế này:
model('Foo) {
...
}
đâu mô hình bây giờ là một chức năng mà sau đó trả về một đối tượng với một phương pháp apply
mà sau đó tiêu thụ các lambda rằng sau. Điều đó tôi có thể sống với. Tôi có thể sống với một vấn đề tương tự bên trong lambda là tốt, vì vậy những thứ như decl 'Real 'x
hoặc decl('Real,'x)
ở bên trong. Nhưng những gì tôi muốn làm là để có được kết quả của tất cả những biểu thức bên trong niềng răng nguệch ngoạc để có được "trả lại" như là một danh sách. Nói cách khác, những gì tôi muốn là viết một cái gì đó như thế này:
model 'Foo {
decl('Real,'x);
decl('Real,'y);
}
nơi decl(...)
đánh giá một cái gì đó kiểu Declaration
và {...}
sau đó đánh giá để List[Declaration]
. Tôi nghi ngờ có một số cách sử dụng implicits để làm điều này, nhưng tôi đã không thể tìm thấy nó. Nói tóm lại, tôi muốn thực hiện:
model 'Foo {
decl('Real,'x);
decl('Real,'y);
}
... đánh giá để tương đương với ...
model 'Foo {
decl('Real,'x) ::
decl('Real,'y) ::
Nil
}
Comments hoặc gợi ý?
Vâng, tôi cũng đã thấy cách tiếp cận này với một số DSL GUI mang tính khai báo. Tôi đồng ý rằng điều này là gần. Tôi chỉ hy vọng không phải giới thiệu() xung quanh toàn bộ sự việc và nhu cầu sử dụng "," là vấn đề bởi vì mỗi lần bạn muốn thêm hoặc xóa, bạn cần phải lo lắng về việc có "," giữa mọi thứ, nhưng không cuối cùng. –
Tôi đã sửa đổi câu trả lời của mình để trả lời nhận xét của bạn. – paradigmatic
Ah, rất thông minh. Sử dụng cú pháp hàm dựng và phương thức được xác định cục bộ. Tôi thích nó và tôi nghĩ nó có thể hoạt động. Trong thực tế, tôi có thể đơn giản hóa nó xuống "Mô hình mới ('Foo) {...}" làm giảm mã xuống. Cách tốt để khai thác thực tế là các dấu ngoặc nhọn trong ngữ cảnh của hàm tạo cho phép bạn giới thiệu mọi thứ dễ dàng trong phạm vi đó. Tôi tự hỏi nếu Scala 2.10 macro sẽ làm cho điều này thậm chí còn đơn giản hơn? –