2016-05-15 11 views
3

Filter I mit Iterables und Verständnis in Julia bin zu spielen und versuchte einfaches Problem zu codieren: alle Zahlenpaare finden weniger als 10, deren Produkt weniger als 10. Das war mein erster Versuch:eine Sammlung von Tupeln

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

aber ich habe Fehler "falsche Anzahl von Argumenten". Dies wird erwartet, da die anonyme Funktion innerhalb des Filters zwei Argumente erwartet, aber ein Tupel erhält. Ich weiß, ich

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

aber es sieht nicht schön aussieht wie der oben. Gibt es eine Möglichkeit, dass ich sagen kann, dass (a, b) Argument des Typs Tupel ist und etwas ähnliches wie Syntax im ersten Beispiel verwendet?

+2

Für dieses spezielle Beispiel können Sie auch den Körper der Funktion anpassen: 'a -> prod (a) <10 ', aber das' @ tup' Beispiel ist ziemlich nette Idee. – jverzani

Antwort

4

Ich glaube nicht, es ist ein Weg, genau das zu tun, wie Sie möchten, aber hier sind einige Alternativen, die Sie für die anonyme Funktion könnte in Erwägung ziehen:

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

Diese können natürlich in Makros gemacht werden, wenn Sie mögen:

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 

Dann wird @tup (a, b) -> a * b < 10 tun, was Sie wollen.

Metaprogramming in Julia ist ziemlich nützlich und häufig für Situationen, in denen Sie etwas immer und immer wieder tun und würde gerne spezialisierte Syntax dafür. Aber ich würde diese Art von Metaprogrammierung vermeiden, wenn dies eine einmalige Sache wäre, weil das Hinzufügen neuer Syntax das Erlernen neuer Syntax bedeutet und den Code schwerer lesbar macht.