2009-09-13 64 views
2

Lua中有加上功能的一個非常好的無括號調用語法倒閉讓我寫下面的Lua閉包在實施DSL

local tag = 1 
function test(obj) 
    return 
     function(str) 
      return 
      function (tbl) 
       tbl.objtag = tag 
       tbl.objname = str 
       return tbl 
      end 
     end 

end 
test (tag) "def" 
{ 
} 

test tag "def" --error 
{ 
} 

但是,如果我身邊(標籤)刪除括號,它導致編譯錯誤。那麼爲什麼Lua允許無括號參數(即「def」)而不是無括號var(在這種情況下是表)參數?

回答

3

Programming in Lua

如果函數有一個單一的參數,這個參數可以是文字字符串或表的構造,那麼括號是可選的:

我你上面的理解情況是標記是一個局部變量(既不是文字字符串也不是表格構造函數),所以test(tag)總是需要括號。您不需要需要圍繞"def"括號,因爲test(tag)返回接受單個字符串的函數,並且該函數立即應用於"def"

+1

謝謝你的解釋。我是如此接近完全成熟的DSL ... – jameszhao00 2009-09-13 16:30:35

+0

是否有任何理由不能通過某種「預處理器」將輸入傳遞給DSL以將括號放在所有內容中? – 2009-09-13 16:47:02

+0

是的,找到了金屬。它完成你所描述的內容。 – jameszhao00 2009-09-13 18:28:59