[swift-evolution] [Idea] custom infix functions
Adrian Zubarev
adrian.zubarev at devandartist.com
Fri Apr 22 15:15:23 CDT 2016
I know that this might be a bit confusing but at least for a syntax highlighting editor this shouldn’t be a problem. Any custom function is displayed with a different color (at least Xcode do).
For structs one could use:
struct B { var x = 10 }
func with<T>(lhs: T, rhs: (inout T) -> Void) -> T {
var mutableValue = lhs
rhs(&mutableValue)
return mutableValue
}
let value = B() with {
$0.x = 40
}
This does even supports Swifty mutation if needed.
`with` statement is just a single example we could create with infix functions.
--
Adrian Zubarev
Am 22. April 2016 bei 22:05:11, Vladimir.S via swift-evolution (swift-evolution at swift.org) schrieb:
On 22.04.2016 22:06, Adrian Zubarev via swift-evolution wrote:
> I’d like to throw an idea in the room and see where this will go.
>
> What if Swift would allow us to create custom infix functions?
> Does Swift need to ability of infix functions?
> How powerful can such a feature be?
> Pros and cons?
>
> There is a discussion about the `with` statement which we could develop
> with infix functions like so:
IMO Such construction will looks like a language construction and will
confuse.
And the function you suggest as replacement for "with" feature will *not*
correctly handle struct instances (Swift 3.0 mar 24):
struct B { var x = 10 }
func with<T: AnyObject>(lhs: T, rhs: @noescape (T) -> Void) { rhs(lhs) }
var b2 = B()
with(b2) { print($0.x) }
It will produce this error :
--------------
Error running code:
l-value expression does not have l-value access kind set
...
-------------
This is why I propose to introduce standard "with" feature(language feature
or built-in method(s)/free function(s)) in Swift out-of-box i.e. tested and
well-working solution in any situation. Not some hack/workaround that each
one will write for himself and that will not work in some situation.
I can implement "with" method in some way for struct that will work like this:
struct B {
var x = 10
mutating func withInPlace(user: @noescape (inout B)->Void) -> B {
var copy = self
user(©)
self = copy
return self
}
func with(user: @noescape (inout B)->Void) -> B {
var copy = self
user(©)
return copy
}
}
var b1 = B().with {
$0.x = 100
}
print("created b1.x = ", b1.x)
b1.withInPlace { $0.x = 1000 }
let c1 = b1.with {
print("b1.x = ", $0.x)
$0.x = 2000
}
print("b1.x = ", b1.x)
print("c1.x = ", c1.x)
But again, this is custom solution, we need standard and tested way to do this.
>
> infix func with<T: AnyObject>(lhs: T, rhs: @noescape (T) -> Void) {
>
> rhs(lhs)
> }
>
> class A {
>
> func foo() {}
> }
>
> let instance: A = A() with {
>
> $0.foo()
> }
>
> So what does the Swift community think about that idea?
>
> --
> Adrian Zubarev
>
>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
>
_______________________________________________
swift-evolution mailing list
swift-evolution at swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160422/d7747fad/attachment.html>
More information about the swift-evolution
mailing list