Or, to be honest:
/// Offers user-facing public assert configuration test
@_transparent
public
func isDebugAssertConfiguration() -> Bool {
return _isDebugAssertConfiguration()
}
which covers, I believe, about 98% of the demand for this feature
-- E
> On May 31, 2016, at 11:21 PM, Brent Royal-Gordon <[email protected]>
> wrote:
>
>> My pitch: I want to promote these three helper functions to the standard
>> library and remove their underscore prefixes.
>
> These functions currently have implementations like this:
>
> @_transparent
> @warn_unused_result
> public // @testable
> func _isDebugAssertConfiguration() -> Bool {
> // The values for the assert_configuration call are:
> // 0: Debug
> // 1: Release
> // 2: Fast
> return Int32(Builtin.assert_configuration()) == 0
> }
>
> I think how this works is:
>
> * @_transparent makes sure these functions are always inlined at the call
> site.
> * Most things in the standard library are *also* @_transparent.
> * Therefore, after both (or more!) inlinings happen, you get the
> `Builtin.assert_configuration()` of the code calling into the standard
> library.
>
> Needless to say, this is *extremely* weird and magical, and I'm skeptical of
> the idea that we should expose it as a normal function call.
>
> I think a better design which would accurately convey its magic is to add a
> type to the standard library:
>
> enum BuildKind: Int32 { case debug, release, unchecked }
>
> (Note: the names in this could use some bikeshedding. Put that aside.)
>
> And then add a `#buildKind` compiler substitution which is equivalent to:
>
> BuildKind(rawValue: Int32(Builtin.assert_configuration()))
>
> Now you can surround your debug-only code with `#buildKind == .debug`. Or you
> can capture the *call site's* build kind with a default parameter:
>
> func log(_ message: String, level: LogLevel = .info, buildKind:
> BuildKind = #buildKind)
>
> Even the standard library might be able to do this if it wanted to, allowing
> your code to enable or disable asserts based on whether your caller's code is
> in debug mode or not:
>
> func assert(@autoclosure condition: () -> Bool, @autoclosure _ message:
> () -> String = default, file: StaticString= #file, line: UInt = #line,
> buildKind: BuildKind = #buildKind)
>
> (I wouldn't suggest that every stdlib member add such a default parameter;
> most should continue to rely on `@_transparent`. But I think that could be
> useful for calls like `assert()` and `precondition()`.
>
> --
> Brent Royal-Gordon
> Architechies
>
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution