         self.init(values)
     }
     
-    // Bindings([String: SQLiteValueConvertible?])
-    //
-    // Supported usage: DictionaryLiteralConvertible adoption:
-    //
-    //     db.execute("INSERT ... (:name, :age)",
-    //                bindings: ["name"; "Arthur", "age": 41])
+    
+    // MARK: - Named SQLite parameters
+    
+    /**
+    Initializes bindings from a dictionary of optional values.
+    
+        let values: [String: String?] = ["firstName": nil, "lastName": "Miller"]
+        db.execute("INSERT ... (:firstName, :lastName)", bindings: Bindings(values))
+    
+    - parameter dictionary: A dictionary of optional values that adopt the
+                            SQLiteValueConvertible protocol.
+    - returns: A Bindings.
+    */
     public init(_ dictionary: [String: SQLiteValueConvertible?]) {
         impl = BindingsDictionaryImpl(dictionary: dictionary)
     }
     
-    // Bindings(NSDictionary)
-    //
-    // This is a convenience initializer.
-    //
-    // Without it, the following code won't compile:
-    //
-    //    let statement = try db.updateStatement("INSERT INTO persons (name, age) VALUES (:name, :age)")
-    //    let persons = [
-    //        ["name": "Arthur", "age": 41],
-    //        ["name": "Barbara"],
-    //    ]
-    //    for person in persons {
-    //        statement.clearBindings()
-    //        statement.bind(Bindings(person))  // Error
-    //        try statement.execute()
-    //    }
+    /**
+    Initializes bindings from an NSDictionary.
+    
+    The dictionary must contain objects that adopt the SQLiteValueConvertible
+    protocol, NSNull, NSNumber or NSString. A fatal error is thrown otherwise.
+    
+        let values: NSDictionary = ["firstName": "Arthur", "lastName": "Miller"]
+        db.execute("INSERT ... (?,?,?)", bindings: Bindings(values))
+    
+    - parameter dictionary: An NSDictionary
+    - returns: A Bindings.
+    */
     public init(_ dictionary: NSDictionary) {
+        // IMPLEMENTATION NOTE
+        //
+        // This initializer is required for the following code to compile:
+        //
+        //    let statement = try db.updateStatement("INSERT INTO persons (name, age) VALUES (:name, :age)")
+        //    let persons = [   // NSArray of NSDictionary, actually
+        //        ["name": "Arthur", "age": 41],
+        //        ["name": "Barbara"],
+        //    ]
+        //    for person in persons {
+        //        try statement.execute(Bindings(person))   // Avoid an error here
+        //    }
         var values = [String: SQLiteValueConvertible?]()
         for (key, item) in dictionary {
             if let key = key as? String {

        return impl.dictionary(defaultColumnNames: defaultColumnNames)
    }
    
    private struct BindingsArrayImpl : BindingsImpl {
        let array: [SQLiteValueConvertible?]
        init(array: [SQLiteValueConvertible?]) {

See https://www.sqlite.org/lang_expr.html#varparam for more information.
*/
public struct Bindings {
    
    // MARK: - Positional SQLite parameters
    
    /**
    Initializes bindings from a sequence of optional values.
    
        let values: [String?] = ["foo", "bar", nil]
        db.execute("INSERT ... (?,?,?)", bindings: Bindings(values))
    
    - parameter sequence: A sequence of optional values that adopt the
                          SQLiteValueConvertible protocol.
    - returns: A Bindings.
    */
    public init<Sequence: SequenceType where Sequence.Generator.Element == Optional<SQLiteValueConvertible>>(_ sequence: Sequence) {
        impl = BindingsArrayImpl(array: Array(sequence))
    }
    
    /**
    Initializes bindings from a sequence of values.
    
        let values: [String] = ["foo", "bar", "baz"]
        db.execute("INSERT ... (?,?,?)", bindings: Bindings(values))
    
    - parameter sequence: A sequence of values that adopt the
                          SQLiteValueConvertible protocol.
    - returns: A Bindings.
    */
    public init<Sequence: SequenceType where Sequence.Generator.Element == SQLiteValueConvertible>(_ sequence: Sequence) {
        impl = BindingsArrayImpl(array: sequence.map { $0 })
    }
    
    /**
    Initializes bindings from an NSArray.
    
    The array must contain objects that adopt the SQLiteValueConvertible
    protocol, NSNull, NSNumber or NSString. A fatal error is thrown otherwise.
    
        let values: NSArray = ["foo", "bar", "baz"]
        db.execute("INSERT ... (?,?,?)", bindings: Bindings(values))
    
    - parameter array: An NSArray
    - returns: A Bindings.
    */
    public init(_ array: NSArray) {
        // IMPLEMENTATION NOTE
        //
        // This initializer is required for the following code to compile:
        //
        //    let statement = try db.updateStatement("INSERT INTO persons (name, age) VALUES (?, ?)")
        //    let persons = [   // NSArray of NSArray, actually
        //        ["Arthur", 41],
        //        ["Barbara"],
        //    ]
        //    for person in persons {
        //        try statement.execute(Bindings(person))   // Avoid an error here
        //    }
        var values = [SQLiteValueConvertible?]()
        for item in array {
            values.append(Bindings.valueFromAnyObject(item))
