[swift-evolution] C-style For Loops

Colin Barrett colin at springsandstruts.com
Mon Dec 7 14:20:51 CST 2015


> On Dec 6, 2015, at 10:18 PM, Brent Royal-Gordon <brent at architechies.com> wrote:
> 
>> Fun fact, you write (albiet with different syntax) C-style for-loops as library code:
>> 
>>> for i in CStyle(0, {$0 < 20}, {$0 += 1}) {
>>> // do something 20 times
>>> }
>> 
>> Where CStyle is just a straightforward implementation of SequenceType. (Tuples allow for simultaneous iteration, which is usually when I end up with C-style for-loops)
> 
> I love the idea of this, but the syntax is remarkably ugly. (It’s actually even worse than you think, because inout closure parameters have to be declared with an exact type.) With a placeholder-based currying syntax, on the other hand…
> 
> 	for i in CSequence(0, _ < 20, _ += 1) { … }
> 
> That’s not too shabby, is it?

This is terrific, Brent!  Thanks for taking a stab at the implementation as well.

Does this move the needle for anyone else on removing for loops?

> 	public struct CSequence <T>: SequenceType {
> 		private let initialValue: T
> 		private let testClosure: T -> Bool
> 		private let incrementClosure: (inout T) -> Void
> 
> 		public init(_ initial: T, _ test: T -> Bool, _ increment: (inout T) -> Void) {
> 			initialValue = initial
> 			testClosure = test
> 			incrementClosure = increment
> 		}
> 
> 		public func generate() -> CGenerator<T> {
> 			return CGenerator(self)
> 		}
> 	}
> 
> 	public struct CGenerator<T>: GeneratorType {
> 		private let sequence: CSequence<T>
> 		private var value: T?
> 		
> 		private init(_ seq: CSequence<T>) {
> 			sequence = seq
> 		}
> 		
> 		public mutating func next() -> T? {
> 			if value != nil {
> 				sequence.incrementClosure(&value!)
> 			}
> 			else {
> 				value = sequence.initialValue
> 			}
> 			if sequence.testClosure(value!) {
> 				return value
> 			}
> 			else {
> 				return nil
> 			}
> 		}
> 	}
> 
> -- 
> Brent Royal-Gordon
> Architechies
> 



More information about the swift-evolution mailing list