Angenommen, ich habe dieses Makro:
%Vor%Dies funktioniert wie erwartet mit "echten" varargs:
%Vor%Aber das Verhalten mit einer Sequenz, die dem Varargs-Typ zugeschrieben wird, ist für mich verwirrend (in Scala 2.10.0-RC3):
%Vor%Und um zu zeigen, dass nichts Fischartiges mit dem abgeleiteten Typ passiert:
%Vor%Ich hätte hier einen Fehler bei der Kompilierung erwartet, und das möchte ich. Ich habe den folgenden Ansatz in den meisten Makros verwendet, die ich geschrieben habe:
%Vor%Und das fängt das Problem zur Kompilierzeit auf:
%Vor%Das fühlt sich für mich allerdings wie ein Hack an - es vermischt ein bisschen Validierung (indem man überprüft, ob die Argumente Literale sind) mit einem anderen (was bestätigt, dass wir wirklich Varargs haben). Ich kann mir auch Fälle vorstellen, in denen ich die Argumente nicht als Literale verwenden muss (oder wenn ich möchte, dass ihr Typ generisch ist).
Ich weiß, ich könnte Folgendes tun:
%Vor% Aber das ist eine hässliche Art, mit einer sehr einfachen (und wahrscheinlich weit notwendigen) Argumentationsvalidierung umzugehen. Gibt es einen Trick, der mir hier fehlt? Was ist der einfachste Weg, um sicherzustellen, dass foo(1 :: Nil: _*)
in meinem ersten Beispiel einen Fehler bei der Kompilierung gibt?
Tags und Links scala macros variadic-functions scala-macros scala-2.10