2016-05-15 102 views
3

我玩iterables和理解的朱莉婭,並試圖代碼的簡單問題的集合:找出所有對數小於10,其產品爲小於10。這是我第一次嘗試:過濾元組

solution = filter((a,b)->a*b<10, product(1:10, 1:10)) 
collect(solution) 

但我得到錯誤「錯誤的參數數目」。這是一種期望,因爲過濾器內的匿名函數需要兩個參數,但它會得到一個元組。 我知道我可以做

solution = filter(p->p[1]*p[2]<10, product(1:10, 1:10)) 

但它並不好看,如上圖所示。有沒有一種方法可以說明(a,b)是類型元組的參數,並在第一個示例中使用類似於語法的東西?

+2

對於這個特定的例子,您也可以調整函數的主體:'a - > prod(a)<10',但'@ tup'示例非常簡潔。 – jverzani

回答

4

我不認爲有辦法做到完全一樣,你想,但在這裏,你可以考慮爲匿名函數一些替代方案:

x->let (a,b)=x; a*b<10 end 
x->((a,b)=x; a*b<10) 

這些當然可以做成如果宏你喜歡:

macro tup(ex) 
    @assert ex.head == :(->) 
    @assert ex.args[1].head == :tuple 
    arg = gensym() 
    quote 
     $arg -> ($(ex.args[1]) = $arg; $(ex.args[2])) 
    end 
end 

然後@tup (a, b) -> a * b < 10會隨你喜歡。

Metaprogramming在朱莉婭是非常有用和常見的情況下,你一遍又一遍地做某些事情,並希望它的專用語法。但是如果這是一次性的話,我會避免這種元編程,因爲添加新的語法意味着學習新的語法並且使代碼更難以閱讀。