Skip to content

Commit 983a674

Browse files
committed
Make use of curried function declaration syntax an error.
<rdar://problem/23111018>
1 parent 638816e commit 983a674

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+121
-682
lines changed

include/swift/AST/DiagnosticsParse.def

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -671,8 +671,8 @@ ERROR(parameter_operator_keyword_argument,none,
671671
ERROR(parameter_unnamed,none,
672672
"unnamed parameters must be written with the empty name '_'", ())
673673

674-
WARNING(parameter_curry_syntax_removed,none,
675-
"curried function declaration syntax will be removed in a future version of Swift; use a single parameter list", ())
674+
ERROR(parameter_curry_syntax_removed,none,
675+
"curried function declaration syntax has been removed; use a single parameter list", ())
676676

677677
//------------------------------------------------------------------------------
678678
// Statement parsing diagnostics

lib/Parse/ParsePattern.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -520,7 +520,7 @@ Parser::parseFunctionArguments(SmallVectorImpl<Identifier> &NamePieces,
520520
paramContext = ParameterContextKind::Curried;
521521
}
522522

523-
// If the decl uses currying syntax, warn that that syntax is going away.
523+
// If the decl uses currying syntax, complain that that syntax has gone away.
524524
if (BodyParams.size() - FirstBodyPatternIndex > 1) {
525525
SourceRange allPatternsRange(
526526
BodyParams[FirstBodyPatternIndex]->getStartLoc(),

test/Constraints/diagnostics.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -260,9 +260,9 @@ func rdar21784170() {
260260
}
261261

262262
// <rdar://problem/21829141> BOGUS: unexpected trailing closure
263-
func expect<T, U>(_: T)(_: U.Type) {} // expected-warning{{curried function declaration syntax will be removed in a future version of Swift}}
264-
func expect<T, U>(_: T, _: Int = 1)(_: U.Type) {} // expected-warning{{curried function declaration syntax will be removed in a future version of Swift}}
265-
expect(Optional(3))(Optional<Int>.self)
263+
func expect<T, U>(_: T) -> (U.Type) -> () { return { ty in () } } // expected-note{{found this candidate}}
264+
func expect<T, U>(_: T, _: Int = 1) -> (U.Type) -> () { return { ty in () } } // expected-note{{found this candidate}}
265+
expect(Optional(3))(Optional<Int>.self) // expected-error{{ambiguous use of 'expect'}}
266266

267267
// <rdar://problem/19804707> Swift Enum Scoping Oddity
268268
func rdar19804707() {
@@ -300,8 +300,8 @@ func r20789423() {
300300

301301

302302

303-
func f7(a: Int)(b : Int) -> Int { // expected-warning{{curried function declaration syntax will be removed in a future version of Swift}}
304-
return a+b
303+
func f7(a: Int) -> (b: Int) -> Int {
304+
return { b in a+b }
305305
}
306306

307307
f7(1)(b: 1)
@@ -319,7 +319,7 @@ f8(b: 1.0) // expected-error {{cannot convert value of type 'Double' to
319319

320320
class CurriedClass {
321321
func method1() {}
322-
func method2(a: Int)(b : Int) {} // expected-warning{{curried function declaration syntax will be removed in a future version of Swift}}
322+
func method2(a: Int) -> (b : Int) -> () { return { b in () } }
323323
func method3(a: Int, b : Int) {}
324324
}
325325

test/Constraints/members.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ struct Z {
4141
func getI() -> Int { return i }
4242
mutating func incI() {}
4343

44-
func curried(x: Int)(y: Int) -> Int { return x + y } // expected-warning{{curried function declaration syntax will be removed in a future version of Swift}}
44+
func curried(x: Int) -> (Int) -> Int { return { y in x + y } }
4545

4646
subscript (k : Int) -> Int {
4747
get {
@@ -78,7 +78,7 @@ var incI = z.incI // expected-error{{partial application of 'mutating'}}
7878
var zi = z.getI()
7979
var zcurried1 = z.curried
8080
var zcurried2 = z.curried(0)
81-
var zcurriedFull = z.curried(0)(y: 1)
81+
var zcurriedFull = z.curried(0)(1)
8282

8383
////
8484
// Members of modules
@@ -110,15 +110,15 @@ enum W {
110110
case Omega
111111

112112
func foo(x: Int) {}
113-
func curried(x: Int)(y: Int) {} // expected-warning{{curried function declaration syntax will be removed in a future version of Swift}}
113+
func curried(x: Int) -> (Int) -> () {}
114114
}
115115

116116
var w = W.Omega
117117
var foo = w.foo
118118
var fooFull : () = w.foo(0)
119119
var wcurried1 = w.curried
120120
var wcurried2 = w.curried(0)
121-
var wcurriedFull : () = w.curried(0)(y: 1)
121+
var wcurriedFull : () = w.curried(0)(1)
122122

123123
// Member of enum Type
124124
func enumMetatypeMember(opt: Int?) {
@@ -328,7 +328,7 @@ protocol Functional {
328328
func apply(v: Vector) -> Scalar
329329
}
330330
protocol Coalgebra {
331-
func coproduct(f: Functional)(v1: Vector, v2: Vector) -> Scalar // expected-warning{{curried function declaration syntax will be removed in a future version of Swift}}
331+
func coproduct(f: Functional) -> (v1: Vector, v2: Vector) -> Scalar
332332
}
333333

334334
// Make sure existential is closed early when we partially apply

test/Constraints/tuple.swift

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,13 @@ extension Int : PosixErrorReturn {
7272
}
7373

7474
func posixCantFail<A, T : protocol<Comparable, PosixErrorReturn>>
75-
(f:(A) -> T)(args:A) -> T // expected-warning{{curried function declaration syntax will be removed in a future version of Swift}}
75+
(f:(A) -> T) -> (args:A) -> T
7676
{
77-
let result = f(args)
78-
assert(result != T.errorReturnValue())
79-
return result
77+
return { args in
78+
let result = f(args)
79+
assert(result != T.errorReturnValue())
80+
return result
81+
}
8082
}
8183

8284
func open(name: String, oflag: Int) -> Int { }

test/DebugInfo/argument.swift

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,6 @@ class A {
5454

5555
}
5656

57-
// Curried functions have their arguments backwards.
58-
// CHECK: !DILocalVariable(name: "b", arg: 1,{{.*}} line: [[@LINE+2]]
59-
// CHECK: !DILocalVariable(name: "a", arg: 2,{{.*}} line: [[@LINE+1]]
60-
func uncurry (a: Int64) (b: Int64) -> (Int64, Int64) {
61-
return (a, b)
62-
}
63-
6457
// CHECK: !DILocalVariable(name: "x", arg: 1,{{.*}} line: [[@LINE+2]]
6558
// CHECK: !DILocalVariable(name: "y", arg: 2,{{.*}} line: [[@LINE+1]]
6659
func tuple(x: Int64, y: (Int64, Float, String)) -> Int64 {

test/Generics/same_type_constraints.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,8 @@ public struct LazySequenceOf<S : SequenceType, A where S.Generator.Element == A>
8585
public subscript(i : A) -> A { return i }
8686
}
8787

88-
public func iterate<A>(f : A -> A)(x : A) -> LazySequenceOf<Iterate<A>, A>? { // expected-warning{{curried function declaration syntax will be removed in a future version of Swift}}
89-
return nil
88+
public func iterate<A>(f : A -> A) -> (x : A) -> LazySequenceOf<Iterate<A>, A>? {
89+
return { x in nil }
9090
}
9191

9292
public final class Iterate<A> : SequenceType {

test/IDE/print_ast_tc_decls.swift

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -177,30 +177,6 @@ struct d0100_FooStruct {
177177
}
178178
// PASS_COMMON-NEXT: {{^}} subscript (i: Int, j: Int) -> Double { get }{{$}}
179179

180-
func curriedVoidFunc1()() {} // expected-warning{{curried function declaration syntax will be removed in a future version of Swift}}
181-
// PASS_COMMON-NEXT: {{^}} func curriedVoidFunc1()(){{$}}
182-
183-
func curriedVoidFunc2()(a: Int) {} // expected-warning{{curried function declaration syntax will be removed in a future version of Swift}}
184-
// PASS_COMMON-NEXT: {{^}} func curriedVoidFunc2()(a: Int){{$}}
185-
186-
func curriedVoidFunc3(a: Int)() {} // expected-warning{{curried function declaration syntax will be removed in a future version of Swift}}
187-
// PASS_COMMON-NEXT: {{^}} func curriedVoidFunc3(a: Int)(){{$}}
188-
189-
func curriedVoidFunc4(a: Int)(b: Int) {} // expected-warning{{curried function declaration syntax will be removed in a future version of Swift}}
190-
// PASS_COMMON-NEXT: {{^}} func curriedVoidFunc4(a: Int)(b: Int){{$}}
191-
192-
func curriedStringFunc1()() -> String { return "" } // expected-warning{{curried function declaration syntax will be removed in a future version of Swift}}
193-
// PASS_COMMON-NEXT: {{^}} func curriedStringFunc1()() -> String{{$}}
194-
195-
func curriedStringFunc2()(a: Int) -> String { return "" } // expected-warning{{curried function declaration syntax will be removed in a future version of Swift}}
196-
// PASS_COMMON-NEXT: {{^}} func curriedStringFunc2()(a: Int) -> String{{$}}
197-
198-
func curriedStringFunc3(a: Int)() -> String { return "" } // expected-warning{{curried function declaration syntax will be removed in a future version of Swift}}
199-
// PASS_COMMON-NEXT: {{^}} func curriedStringFunc3(a: Int)() -> String{{$}}
200-
201-
func curriedStringFunc4(a: Int)(b: Int) -> String { return "" } // expected-warning{{curried function declaration syntax will be removed in a future version of Swift}}
202-
// PASS_COMMON-NEXT: {{^}} func curriedStringFunc4(a: Int)(b: Int) -> String{{$}}
203-
204180
func bodyNameVoidFunc1(a: Int, b x: Float) {}
205181
// PASS_COMMON-NEXT: {{^}} func bodyNameVoidFunc1(a: Int, b x: Float){{$}}
206182

test/IDE/print_types.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ func testVariadicFuncType(a: Int, b: Float...) {}
9999
// CHECK: FuncDecl '''testVariadicFuncType''' (Int, b: Float...) -> (){{$}}
100100
// FULL: FuncDecl '''testVariadicFuncType''' (Swift.Int, b: Swift.Float...) -> (){{$}}
101101

102-
func testCurriedFuncType1(a: Int)(b: Float) {} // expected-warning{{curried function declaration syntax will be removed in a future version of Swift}}
102+
func testCurriedFuncType1(a: Int) -> (b: Float) -> () {}
103103
// CHECK: FuncDecl '''testCurriedFuncType1''' (Int) -> (b: Float) -> (){{$}}
104104
// FULL: FuncDecl '''testCurriedFuncType1''' (Swift.Int) -> (b: Swift.Float) -> (){{$}}
105105

test/IRGen/class.sil

Lines changed: 0 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import Swift
1111
// CHECK: [[TYPE:%swift.type]] = type
1212
// CHECK: [[C_CLASS:%C5class1C]] = type
1313
// CHECK: [[REF:%swift.refcounted]] = type
14-
// CHECK: [[D_CLASS:%C5class1D]] = type
1514
// CHECK: [[OBJCOBJ:%objc_object]] = type
1615

1716
class C {}
@@ -44,26 +43,6 @@ sil_vtable C {}
4443
// \ CHECK: i64 add (i64 ptrtoint ({{.*}}* @_DATA__TtC5class1C to i64), i64 1)
4544
// \ CHECK: }
4645

47-
// CHECK: @_TMfC5class1D = internal global { {{.*}} } {
48-
// \ CHECK: void ([[D_CLASS]]*)* @_TFC5class1DD,
49-
// \ CHECK: i8** @_TWVBo,
50-
// \ CHECK: i64 ptrtoint ([[OBJCCLASS]]* @_TMmC5class1D to i64),
51-
// \ CHECK: [[OBJCCLASS]]* @"OBJC_CLASS_$_SwiftObject",
52-
// \ CHECK: [[OPAQUE]]* @_objc_empty_cache,
53-
// \ CHECK: [[OPAQUE]]* null,
54-
// \ CHECK: i64 add (i64 ptrtoint ({{.*}}* @_DATA__TtC5class1D to i64), i64 1),
55-
// \ CHECK: i32 3,
56-
// \ CHECK: i32 0,
57-
// \ CHECK: i32 16,
58-
// \ CHECK: i16 7,
59-
// \ CHECK: i16 0,
60-
// \ CHECK: i32 112,
61-
// \ CHECK: i32 16,
62-
// \ CHECK: {{.*}}* @_TMnC5class1D,
63-
// \ CHECK: i8* null,
64-
// \ CHECK: i32 (i16, i8, [[D_CLASS]]*)* @_TFC5class1D8multiplyfS0_fT1xBi8__FT1yBi16__Bi32_
65-
// \ CHECK: }
66-
6746
// Destroying destructor
6847
// CHECK: define [[REF]]* @_TFC5class1Cd([[C_CLASS]]*) {{.*}} {
6948
// CHECK-NEXT: entry:
@@ -109,28 +88,6 @@ entry(%c : $C):
10988
return %r : $Builtin.UnknownObject
11089
}
11190

112-
// Part of rdar://16079147
113-
// vtable tested above
114-
class D {
115-
func multiply(x x : Builtin.Int8)(y : Builtin.Int16) -> Builtin.Int32
116-
}
117-
118-
sil @_TFC5class1DD : $@convention(method) (@owned D) -> () {
119-
bb0(%0 : $D):
120-
%1 = tuple ()
121-
return %1 : $()
122-
}
123-
124-
sil hidden @_TFC5class1D8multiplyfS0_fT1xBi8__FT1yBi16__Bi32_ : $@convention(method) (Builtin.Int16, Builtin.Int8, @guaranteed D) -> Builtin.Int32 {
125-
bb0(%0 : $Builtin.Int16, %1 : $Builtin.Int8, %2 : $D):
126-
%3 = integer_literal $Builtin.Int32, 0
127-
return %3 : $Builtin.Int32
128-
}
129-
130-
sil_vtable D {
131-
#D.multiply!2: _TFC5class1D8multiplyfS0_fT1xBi8__FT1yBi16__Bi32_
132-
}
133-
13491
// CHECK-LABEL: define %C5class1C* @alloc_ref_dynamic(%swift.type*)
13592
sil @alloc_ref_dynamic : $@convention(thin) (@thick C.Type) -> @owned C {
13693
bb0(%0 : $@thick C.Type):

test/IRGen/partial_apply_generic.swift

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,11 @@ struct Spoon: Runcible {
2525
typealias Element = Mince
2626
}
2727

28-
func split<Seq: Runcible>(seq: Seq)(isSeparator: Seq.Element -> Bool) { }
29-
28+
func split<Seq: Runcible>(seq: Seq) -> (Seq.Element -> Bool) -> () {
29+
return {(isSeparator: Seq.Element -> Bool) in
30+
return ()
31+
}
32+
}
3033
var seq = Spoon()
3134
var x = seq ~> split
3235

@@ -39,10 +42,15 @@ var x = seq ~> split
3942
// CHECK: tail call { i8*, %swift.refcounted* } @_TF21partial_apply_generic5split{{.*}}(%swift.opaque* noalias nocapture [[REABSTRACT]],
4043

4144
struct HugeStruct { var a, b, c, d: Int }
42-
func hugeStructReturn()(h: HugeStruct) -> HugeStruct { return h }
43-
var y = hugeStructReturn()
44-
// CHECK-LABEL: define internal void @_TPA__TF21partial_apply_generic16hugeStructReturn{{.*}}(%V21partial_apply_generic10HugeStruct* noalias nocapture sret, %V21partial_apply_generic10HugeStruct* noalias nocapture dereferenceable({{.*}}), %swift.refcounted*) {{.*}} {
45-
// CHECK: tail call void @_TF21partial_apply_generic16hugeStructReturn{{.*}}(%V21partial_apply_generic10HugeStruct* noalias nocapture sret %0, %V21partial_apply_generic10HugeStruct* noalias nocapture dereferenceable({{.*}}) %1)
45+
struct S {
46+
func hugeStructReturn(h: HugeStruct) -> HugeStruct { return h }
47+
}
48+
49+
let s = S()
50+
var y = s.hugeStructReturn
51+
// CHECK-LABEL: define internal void @_TPA__TFV21partial_apply_generic1S16hugeStructReturnfVS_10HugeStructS1_(%V21partial_apply_generic10HugeStruct* noalias nocapture sret, %V21partial_apply_generic10HugeStruct* noalias nocapture dereferenceable(32), %swift.refcounted*) #0 {
52+
// CHECK: entry:
53+
// CHECK: tail call void @_TFV21partial_apply_generic1S16hugeStructReturnfVS_10HugeStructS1_(%V21partial_apply_generic10HugeStruct* noalias nocapture sret %0, %V21partial_apply_generic10HugeStruct* noalias nocapture dereferenceable(32) %1) #0
4654
// CHECK: ret void
4755
// CHECK: }
4856

test/Interpreter/currying_generics.swift

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
// RUN: %target-run-simple-swift | FileCheck %s
22
// REQUIRES: executable_test
33

4-
func curry<T, U, V>(f: (T, U) -> V)(_ x: T)(_ y: U) -> V {
5-
return f(x, y)
4+
func curry<T, U, V>(f: (T, U) -> V) -> (T) -> (U) -> V {
5+
return { x in { y in f(x, y) } }
66
}
77

8-
func curry<T1, T2, T3, T4>(f: (T1, T2, T3) -> T4)(_ x: T1)(_ y: T2)(_ z: T3) -> T4 {
9-
return f(x, y, z)
8+
func curry<T1, T2, T3, T4>(f: (T1, T2, T3) -> T4) -> (T1) -> (T2) -> (T3) -> T4 {
9+
return { x in { y in { z in f(x, y, z) } } }
1010
}
1111

1212
func concat(x: String, _ y: String, _ z: String) -> String {
@@ -91,8 +91,8 @@ print(test_compose_closure(20)) // CHECK-NEXT: 21
9191

9292
// rdar://problem/18988428
9393

94-
func clamp<T: Comparable>(minValue: T, _ maxValue: T)(n: T) -> T {
95-
return max(minValue, min(n, maxValue))
94+
func clamp<T: Comparable>(minValue: T, _ maxValue: T) -> (n: T) -> T {
95+
return { n in max(minValue, min(n, maxValue)) }
9696
}
9797

9898
let clampFoo2 = clamp(10.0, 30.0)
@@ -105,8 +105,8 @@ func pair<T,U> (a: T) -> U -> (T,U) {
105105
return { b in (a,b) }
106106
}
107107

108-
func pair_<T,U> (a: T)(b: U) -> (T,U) {
109-
return (a,b)
108+
func pair_<T,U> (a: T) -> (b: U) -> (T,U) {
109+
return { b in (a,b) }
110110
}
111111

112112
infix operator <+> { }
@@ -130,20 +130,20 @@ print((b <+> pair_)(a!)) // CHECK-NEXT: (42, 23)
130130
struct Identity<A> { let value: A }
131131
struct Const<A, B> { let value: A }
132132

133-
func fmap<A, B>(f: A -> B)(_ identity: Identity<A>) -> Identity<B> {
134-
return Identity(value: f(identity.value))
133+
func fmap<A, B>(f: A -> B) -> (Identity<A>) -> Identity<B> {
134+
return { identity in Identity(value: f(identity.value)) }
135135
}
136136

137-
func fmap<A, B>(f: A -> B)(_ const: Const<A, B>) -> Const<A, B> {
138-
return const
137+
func fmap<A, B>(f: A -> B) -> (Const<A, B>) -> Const<A, B> {
138+
return { const in const }
139139
}
140140

141141
// really Const()
142142
func _Const<A, B>(a: A) -> Const<A, B> {
143143
return Const(value: a)
144144
}
145-
func const<A, B>(a: A)(_: B) -> A {
146-
return a
145+
func const<A, B>(a: A) -> (B) -> A {
146+
return { _ in a }
147147
}
148148

149149
// really Identity()
@@ -160,24 +160,24 @@ func runIdentity<A>(i: Identity<A>) -> A {
160160
}
161161

162162

163-
func view<S, A>(lens: (A -> Const<A, S>) -> S -> ((A -> S) -> Const<A, S> -> Const<A, S>) -> Const<A, S>)(_ s: S) -> A {
164-
return getConst(lens(_Const)(s)(fmap))
163+
func view<S, A>(lens: (A -> Const<A, S>) -> S -> ((A -> S) -> Const<A, S> -> Const<A, S>) -> Const<A, S>) -> (S) -> A {
164+
return { s in getConst(lens(_Const)(s)(fmap)) }
165165
}
166166

167-
func over<S, A>(lens: (A -> Identity<A>) -> S -> ((A -> S) -> Identity<A> -> Identity<S>) -> Identity<S>)(_ f: A -> A)(_ s: S) -> S {
168-
return runIdentity(lens({ _Identity(f($0)) })(s)(fmap))
167+
func over<S, A>(lens: (A -> Identity<A>) -> S -> ((A -> S) -> Identity<A> -> Identity<S>) -> Identity<S>) -> (A -> A) -> (S) -> S {
168+
return { f in { s in runIdentity(lens({ _Identity(f($0)) })(s)(fmap)) } }
169169
}
170170

171-
func set<S, A>(lens: (A -> Identity<A>) -> S -> ((A -> S) -> Identity<A> -> Identity<S>) -> Identity<S>)(_ x: A)(_ y: S) -> S {
172-
return over(lens)(const(x))(y)
171+
func set<S, A>(lens: (A -> Identity<A>) -> S -> ((A -> S) -> Identity<A> -> Identity<S>) -> Identity<S>) -> (A) -> (S) -> S {
172+
return { x in { y in over(lens)(const(x))(y) } }
173173
}
174174

175-
func _1<A, B, C, D>(f: A -> C)(_ x: A, _ y: B)(_ fmap: (A -> (A, B)) -> C -> D) -> D {
176-
return fmap({ ($0, y) })(f(x))
175+
func _1<A, B, C, D>(f: A -> C) -> (A, B) -> ((A -> (A, B)) -> C -> D) -> D {
176+
return { (x, y) in { fmap in fmap({ ($0, y) })(f(x)) } }
177177
}
178178

179-
func _2<A, B, C, D>(f: B -> C)(_ x: A, _ y: B)(_ fmap: (B -> (A, B)) -> C -> D) -> D {
180-
return fmap({ (x, $0) })(f(y))
179+
func _2<A, B, C, D>(f: B -> C) -> (A, B) -> ((B -> (A, B)) -> C -> D) -> D {
180+
return { (x, y) in { fmap in fmap({ (x, $0) })(f(y)) } }
181181
}
182182

183183

test/Interpreter/currying_protocols.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ struct Steroids {}
1010
protocol Gymnast {
1111
func backflip(angle: Double) -> Self
1212
func compete() -> Medal -> Self
13-
func scandal()(s: Steroids) -> ()
13+
func scandal() -> (Steroids) -> ()
1414
static func currentYear() -> Int
1515
}
1616

@@ -27,8 +27,8 @@ final class Archimedes : Gymnast {
2727
}
2828
}
2929

30-
func scandal()(s: Steroids) -> () {
31-
print("Archimedes don't do that")
30+
func scandal() -> (Steroids) -> () {
31+
return { s in print("Archimedes don't do that") }
3232
}
3333

3434
static func currentYear() -> Int {

0 commit comments

Comments
 (0)