2012-02-07 71 views
6

我正在創建一個小型scala DSL,並遇到以下問題,但我沒有真正解決問題。我想要什麼小的概念性例子來實現:Scala DSL:使用無參數方法鏈接方法

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

代碼定義這個DSL大致是這樣的:

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

現在的問題:我該如何計算後襬脫這些括號?可能嗎?如果是這樣,怎麼樣?只是在定義中忽略它們並不能解決編譯錯誤。

回答

3

好吧,我想,我發現了一個可接受的解決方案......現在我實現了這個可能的語法

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

使用名爲對象「|」,我能夠寫出近我想要的DSL 。非常規,一個「;」如果其無參數,則在計算後需要。這裏的技巧是接受DSL對象本身(這裏是它的下一行的「|」)。使此參數隱含也允許calc作爲此代碼中的最後一個語句。 好吧,看起來確實不可能按照我想要的方式擁有它,但這也可以。

+0

耶!整蠱! ))) – noncom 2012-09-11 08:47:33

-1

首先嚐試從calc的定義中刪除括號。其次嘗試在整體上使用大括號而不是括號。大括號和括號並不意味着相同,我發現括號在單行代碼中效果最好(除非使用分號)。另請參見What is the formal difference in Scala between braces and parentheses, and when should they be used?

+1

這裏有一個使用parantheses的原因。方法鏈並不真正適用於換行符,除非它被「()」包圍,因爲scala知道它是唯一的一條語句。不適用於「{}」。離開calc def的缺陷並不奏效,因爲那時,語法scala糖不再起作用,我不能鏈式調用另一種方法 – wrm 2012-02-07 10:01:50

+0

啊..我正在想另一種方式。你有什麼編譯錯誤?你能壓縮你的例子是否可以運行? – thoredge 2012-02-07 11:55:25

+0

它標記最後一行並說: \t - 在類Compute中缺少方法寫入的參數; '''如果您想將其視爲部分應用函數,請按照此方法 \t - ')'預期但找到符號字面量。 這裏的問題是從'x.y(p1).z(p2)'到'x y p1 z p2'的正常轉換不起作用,因爲它更像'x.y.z(p2)',它不能明顯地轉換爲糖。除了使用方法鏈來實現類似的功能外,還有其他一些方法,但是我無法找到一種實現THIS語法的工作方式...... – wrm 2012-02-07 12:39:19

3

不可能擺脫括號,但可以將其替換。例如:

object it 

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

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

要擴大一點,每當看到斯卡拉是這樣的:

object method 
non-reserved-word 

它假定它意味着object.method(non-reserved-word)。相反,每當它看到這樣的事情:

object method object 
method2 object2 

它假定這是兩個獨立的語句,如object.method(object); method2.object,期待method2是一個新的對象,object2的方法。

這些假設是斯卡拉文法的一部分:它的目的就是這樣。

+0

我剛來到一個類似的解決方案(有calc的參數),就像我剛纔寫的一樣(參見我的答案)。我還嘗試了其他幾種方法,如一個case類或一個靜態方法調用,但看起來,這是唯一的方法 – wrm 2012-02-07 18:12:54

+0

如果您有一些時間,請問爲什麼無法擺脫圓括號? – kisileno 2013-09-05 13:37:14

+0

另一個問題是圍繞所有表達式的括號,我們可以避免它們,以及如何? – kisileno 2013-09-05 13:47:59