2012-08-10 10 views
5

Tôi mới dùng Groovy và tôi đang cố viết một DSL nhỏ cho một số tác vụ cụ thể. Với mục đích này, tôi đã cố gắng để giải quyết một vấn đề như thế này dưới đây: Tôi muốn in (và/hoặc trả lại) 5 bằng cách gọi mã này (mà không sử dụng parantheses):DSL với Groovy -> chuyển giá trị tham số

give me 5 

tôi mong đợi định nghĩa như sau sẽ hoạt động:

def give = {clos -> return clos} 
def me = {clos -> println clos; return clos} 

nhưng thực tế là không. Bạn có thể vui lòng giúp tôi cách xác định "cung cấp" và "tôi" để trả về giá trị 5 với cụm từ "tặng tôi 5" trong đó tôi phải đóng, cung cấp cũng có thể là metaClass, thuộc tính, v.v.

Cảm ơn trước! Iv

Trả lời

3

Groovy 1.8+ mất

give me 5 

và phân tích cú pháp có hiệu quả cố gắng để làm:

give(me).5 

Vì vậy, nếu bạn viết mã của bạn như thế này, nó hoạt động:

def give = { map -> map } 
def me = [:].withDefault { it } 

a = give me 5 

println a 

bản in:

5 
+0

Cảm ơn bạn! Đó chính xác là những gì tôi đang tìm kiếm. Bạn có thể tham khảo một số nơi mà tôi có thể đọc thêm về cấu trúc [:]. WithDefault không? – ivita

+0

@ivita Đừng lo! Nó được định nghĩa [ở đây] (http://groovy.codehaus.org/groovy-jdk/java/util/Map.html#withDefault%28groovy.lang.Closure%29).Một điều cần lưu ý là '' 5'' nó được in ra thực sự là một String, và không phải là một 'Integer'. Điều này là bởi vì nó cố gắng để có được '5' như một tên thuộc tính (String), do đó trả về một String cũng như –

+0

Tôi cần nó như là chuỗi :-) Cảm ơn! – ivita

1

Đóng cửa của bạn là chính xác. Niềng răng bị thiếu. Hãy thử điều này

give(me(5)) or 
give me(5) 

Nếu bạn hoàn toàn cần phải loại bỏ niềng răng, hãy gán các phần vào biến để cho trình phân tích cú pháp hiểu chính xác những gì cần phải được chuyển.

five = me 5 
give five 
+0

Cảm ơn, công trình này, nhưng tôi quên đề cập đến rằng tôi muốn quy tắc của tôi hoạt động mà không có dấu ngoặc đơn. Bạn có bất kỳ ý tưởng làm thế nào để làm điều đó? – ivita

-1

Phương pháp của bạn có ý nghĩa gì? Bạn đã viết một yêu cầu cú pháp:

give me 5 

Nếu tôi có thể bạn, bạn cần:

give("me", 5) 
give "me", 5 //equivalent "DSL" notation 
give("you", 7) 
give "you", 7 //equivalent "DSL" notation 

//or... 
def me= "Mickey", you= "Donald" 
give(me, 5) 
give me, 5 //equivalent "DSL" notation 
give(you, 7) 
give you, 7 //equivalent "DSL" notation 

Nếu tôi bao giờ thay đổi, ngữ nghĩa là gần gũi nhất đến:

giveMe(5) 
giveMe 5 //equivalent "DSL" notation 

Bạn đã viết "tôi phải là một đóng cửa "và" tôi muốn quy tắc của tôi hoạt động mà không có dấu ngoặc đơn ", bắt đầu từ các ràng buộc cú pháp. Luôn bắt đầu từ các yêu cầu ngữ nghĩa :-)