diff --git a/builtin/core.wren b/builtin/core.wren index 381ab6bb..534c21bf 100644 --- a/builtin/core.wren +++ b/builtin/core.wren @@ -1,4 +1,22 @@ -class List { +class Sequence { + map (f) { + var result = [] + for (element in this) { + result.add(f.call(element)) + } + return result + } + + where (f) { + var result = [] + for (element in this) { + if (f.call(element)) result.add(element) + } + return result + } +} + +class List is Sequence { toString { var result = "[" for (i in 0...count) { @@ -16,20 +34,6 @@ class List { } return result } - - map (f) { - var result = [] - for (element in this) { - result.add(f.call(element)) - } - return result - } - - where (f) { - var result = [] - for (element in this) { - if (f.call(element)) result.add(element) - } - return result - } } + +class Range is Sequence {} diff --git a/src/wren_core.c b/src/wren_core.c index 7a20200a..e1863ef5 100644 --- a/src/wren_core.c +++ b/src/wren_core.c @@ -41,7 +41,25 @@ // This string literal is generated automatically from core. Do not edit. static const char* libSource = -"class List {\n" +"class Sequence {\n" +" map (f) {\n" +" var result = []\n" +" for (element in this) {\n" +" result.add(f.call(element))\n" +" }\n" +" return result\n" +" }\n" +"\n" +" where (f) {\n" +" var result = []\n" +" for (element in this) {\n" +" if (f.call(element)) result.add(element)\n" +" }\n" +" return result\n" +" }\n" +"}\n" +"\n" +"class List is Sequence {\n" " toString {\n" " var result = \"[\"\n" " for (i in 0...count) {\n" @@ -59,23 +77,9 @@ static const char* libSource = " }\n" " return result\n" " }\n" -" \n" -" map (f) {\n" -" var result = []\n" -" for (element in this) {\n" -" result.add(f.call(element))\n" -" }\n" -" return result\n" -" }\n" -" \n" -" where (f) {\n" -" var result = []\n" -" for (element in this) {\n" -" if (f.call(element)) result.add(element)\n" -" }\n" -" return result\n" -" }\n" -"}\n"; +"}\n" +"\n" +"class Range is Sequence {}\n"; // Validates that the given argument in [args] is a Num. Returns true if it is. // If not, reports an error and returns false. @@ -953,16 +957,6 @@ void wrenInitializeCore(WrenVM* vm) NATIVE(vm->numClass, ".. ", num_dotDot); NATIVE(vm->numClass, "... ", num_dotDotDot); - vm->rangeClass = defineClass(vm, "Range"); - NATIVE(vm->rangeClass, "from", range_from); - NATIVE(vm->rangeClass, "to", range_to); - NATIVE(vm->rangeClass, "min", range_min); - NATIVE(vm->rangeClass, "max", range_max); - NATIVE(vm->rangeClass, "isInclusive", range_isInclusive); - NATIVE(vm->rangeClass, "iterate ", range_iterate); - NATIVE(vm->rangeClass, "iteratorValue ", range_iteratorValue); - NATIVE(vm->rangeClass, "toString", range_toString); - vm->stringClass = defineClass(vm, "String"); NATIVE(vm->stringClass, "contains ", string_contains); NATIVE(vm->stringClass, "count", string_count); @@ -985,6 +979,16 @@ void wrenInitializeCore(WrenVM* vm) NATIVE(vm->listClass, "[ ]", list_subscript); NATIVE(vm->listClass, "[ ]=", list_subscriptSetter); + vm->rangeClass = AS_CLASS(findGlobal(vm, "Range")); + NATIVE(vm->rangeClass, "from", range_from); + NATIVE(vm->rangeClass, "to", range_to); + NATIVE(vm->rangeClass, "min", range_min); + NATIVE(vm->rangeClass, "max", range_max); + NATIVE(vm->rangeClass, "isInclusive", range_isInclusive); + NATIVE(vm->rangeClass, "iterate ", range_iterate); + NATIVE(vm->rangeClass, "iteratorValue ", range_iteratorValue); + NATIVE(vm->rangeClass, "toString", range_toString); + // These are defined just so that 0 and -0 are equal, which is specified by // IEEE 754 even though they have different bit representations. NATIVE(vm->numClass, "== ", num_eqeq); diff --git a/test/list/map.wren b/test/list/map.wren index 1481c3f0..729f6bea 100644 --- a/test/list/map.wren +++ b/test/list/map.wren @@ -1,5 +1,3 @@ var a = [1, 2, 3] -var inc = fn (x) { return x + 1 } -var b = a.map(inc) - +var b = a.map(fn (x) x + 1) IO.print(b) // expect: [2, 3, 4] diff --git a/test/list/type.wren b/test/list/type.wren index 5f63fe6f..19f706dc 100644 --- a/test/list/type.wren +++ b/test/list/type.wren @@ -1,4 +1,5 @@ IO.print([] is List) // expect: true +IO.print([] is Sequence) // expect: true IO.print([] is Object) // expect: true IO.print([] is Bool) // expect: false IO.print([].type == List) // expect: true diff --git a/test/list/where.wren b/test/list/where.wren index d8b0a2f3..ad0129c1 100644 --- a/test/list/where.wren +++ b/test/list/where.wren @@ -1,8 +1,6 @@ var a = [1, 2, 3] -var moreThan1 = fn (x) { return x > 1 } -var moreThan10 = fn (x) { return x > 10 } -var b = a.where(moreThan1) -var c = a.where(moreThan10) - +var b = a.where(fn (x) x > 1) IO.print(b) // expect: [2, 3] + +var c = a.where(fn (x) x > 10) IO.print(c) // expect: [] diff --git a/test/range/map.wren b/test/range/map.wren new file mode 100644 index 00000000..5bcd9511 --- /dev/null +++ b/test/range/map.wren @@ -0,0 +1,3 @@ +var a = 1..3 +var b = a.map(fn (x) x + 1) +IO.print(b) // expect: [2, 3, 4] diff --git a/test/range/type.wren b/test/range/type.wren index c7fe8873..56f5b85e 100644 --- a/test/range/type.wren +++ b/test/range/type.wren @@ -1,6 +1,7 @@ var range = 2..5 IO.print(range is Range) // expect: true +IO.print(range is Sequence) // expect: true IO.print(range is Object) // expect: true IO.print(range is String) // expect: false IO.print(range.type == Range) // expect: true diff --git a/test/range/where.wren b/test/range/where.wren new file mode 100644 index 00000000..39b7468a --- /dev/null +++ b/test/range/where.wren @@ -0,0 +1,6 @@ +var a = 1..3 +var b = a.where(fn (x) x > 1) +IO.print(b) // expect: [2, 3] + +var c = a.where(fn (x) x > 10) +IO.print(c) // expect: []