2012-02-07 31 views
6

tôi đang tạo một DSL nhỏ scala và chạy vào vấn đề sau mà tôi không thực sự có một giải pháp. Một ví dụ nhỏ về khái niệm của những gì tôi muốn đạt được:Scala DSL: phương pháp chuỗi với phương pháp không tham số

(Compute 
write "hello" 
read 'name 
calc() 
calc() 
write "hello" + 'name 
) 

mã xác dsl đây là loại như thế này:

Object Compute extends Compute{ 
    ... 
implicit def str2Message:Message = ... 
} 
class Compute{ 
def write(msg:Message):Compute = ... 
def read(s:Symbol):Compute = ... 
def calc():Compute = { ... } 
} 

Bây giờ câu hỏi: làm thế nào tôi có thể thoát khỏi những ngoặc sau calc ? là nó có thể? nếu vậy, làm thế nào? chỉ cần bỏ qua chúng trong định nghĩa không giúp đỡ vì lỗi biên dịch.

Trả lời

3

ok, tôi nghĩ rằng, tôi tìm thấy một giải pháp chấp nhận được ... bây giờ tôi đã đạt được cú pháp thể này

| write "hello" 
| read 'name 
| calc 
| calc 
| write "hello " + 'name 

sử dụng một đối tượng có tên "|", tôi vẫn có thể ghi gần dsl tôi muốn . normaly, a ";" là cần thiết sau khi calc nếu parameterless của nó. Bí quyết ở đây là chấp nhận chính đối tượng DSL (ở đây, nó là "|" trên dòng tiếp theo). làm cho tham số này ngầm cũng cho phép calc làm tuyên bố cuối cùng trong mã này. tốt, có vẻ như chắc chắn là không thể có nó theo cách tôi muốn, nhưng điều này cũng ok quá

+0

Yay! Khôn lanh!)))) – noncom

-1

Trước tiên, hãy thử xóa dấu ngoặc đơn khỏi định nghĩa của calc. Thứ hai cố gắng sử dụng dấu ngoặc nhọn xung quanh toàn bộ thay vì dấu ngoặc đơn. Niềng răng xoăn và dấu ngoặc đơn không có nghĩa là giống nhau và tôi thấy rằng dấu ngoặc đơn hoạt động tốt nhất trong mã dòng đơn (trừ khi sử dụng dấu chấm phẩy). Xem thêm What is the formal difference in Scala between braces and parentheses, and when should they be used?

+1

có một lý do để sử dụng các dấu ngoặc ở đây. methodchaining không thực sự làm việc với newlines, ngoại trừ nếu nó được bao quanh bởi "()" bởi vì sau đó scala biết, chỉ có một câu lệnh của nó. không hoạt động với "{}". để lại các parantheses của calc def doesnt làm việc, hoặc bởi vì sau đó, cú pháp scala đường không hoạt động nữa và tôi không thể chain-gọi một phương pháp khác – wrm

+0

Ah .. phải tôi đã suy nghĩ theo cách khác xung quanh. Bạn nhận được lỗi biên dịch nào? Bạn có thể ngưng tụ ví dụ của mình để có thể chạy được không? – thoredge

+0

nó đánh dấu dòng cuối cùng và nói: \t - các đối số bị thiếu cho phương thức ghi trong lớp Tính toán; hãy làm theo phương pháp này với '_' nếu bạn muốn coi nó là hàm được áp dụng một phần \t - ')' được mong đợi nhưng tìm thấy ký hiệu bằng chữ. vấn đề ở đây là chuyển đổi bình thường từ 'x.y (p1) .z (p2)' thành 'x y p1 z p2' không hoạt động, vì nó giống' x.y.z (p2) 'không thể chuyển đổi thành đường rõ ràng hơn.có những cách khác hơn là sử dụng phương pháp chuỗi để đạt được một cái gì đó tương tự nhưng tôi không thể tìm thấy một cách làm việc để đạt được cú pháp này ... – wrm

3

Không thể loại bỏ dấu ngoặc đơn, nhưng bạn có thể thay thế dấu ngoặc đơn. Ví dụ:

object it 

class Compute { 
def calc(x: it.type):Compute = { ... } 

(Compute 
write "hello" 
read 'name 
calc it 
calc it 
write "hello" + 'name 
) 

Để mở rộng một chút, bất cứ khi nào Scala thấy một cái gì đó như thế này:

object method 
non-reserved-word 

Nó giả định nó có nghĩa object.method(non-reserved-word). Ngược lại, bất cứ khi nào nó thấy một cái gì đó như thế này:

object method object 
method2 object2 

Nó giả định đây là hai câu lệnh độc lập, như trong object.method(object); method2.object, mong method2 trở thành một đối tượng mới, và object2 một phương pháp.

Những giả định này là một phần của ngữ pháp Scala: có nghĩa là mục đích này có mục đích.

+0

tôi chỉ đến một giải pháp tương tự (có calc mất một tham số) như tôi đã viết chỉ vào thời điểm này (xem câu trả lời của tôi). Tôi cũng đã thử một số cách khác như một trường hợp lớp hoặc một cuộc gọi phương pháp tĩnh, nhưng có vẻ như, rằng đây là cách duy nhất – wrm

+0

Nếu bạn có một thời gian, bạn có thể vui lòng viết lý do tại sao điều này là không thể thoát khỏi dấu ngoặc đơn? – kisileno

+0

Và một câu hỏi khác là về dấu ngoặc đơn làm tròn mọi biểu thức, chúng ta có thể tránh chúng và làm thế nào? – kisileno

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