[swift-evolution] [Design Question] Metaprogramming as a non-goal
Dave Abrahams
dabrahams at apple.com
Sun Jan 24 16:54:29 CST 2016
on Sat Jan 23 2016, Michael Henson <swift-evolution at swift.org> wrote:
> In the swift/docs/Generics.rst documentation, I see:
>
> "
> As important as the goals of a feature are the explicit non-goals, which we
> don't want
> or don't need to support:
> * Compile-time "metaprogramming" in any form
> * Expression-template tricks a la Boost.Spirit, POOMA
> "
>
> What kinds of things count as compile-time metaprogramming? I've been
> tinkering with some ideas related to the type system and having a more
> specific description here might help me pare many / most / all of them
> down.
Some of us suspect that the generics model we already have would offer
this capability, if it weren't for bugs in the implementation:
protocol BooleanType {}
struct False : BooleanType {}
struct True : BooleanType {}
protocol IfType {
typealias C : BooleanType
typealias T
typealias F
typealias Result = F
var result: Result? {get}
}
extension IfType {
var result: Result? { return nil }
}
// Take this extension away to change the result
extension IfType where Self.C == True {
var result: T? { return nil }
}
struct If<C_: BooleanType, T_, F_> : IfType {
typealias C = C_
typealias T = T_
typealias F = F_
}
print(If<True, Int, String>.Result.self) // prints Int; OK
print(If<False, Int, String>.Result.self) // prints Int; should print String
But, basically, that part is saying we would prefer it if ideas like
this were expressed directly (e.g. by an actual "if" statement used with
a macro system) rather than by hijacking features of generics.
HTH,
--
-Dave
More information about the swift-evolution
mailing list