diff --git a/builtin/core.wren b/builtin/core.wren index 52ae9ac3..eaf7a24e 100644 --- a/builtin/core.wren +++ b/builtin/core.wren @@ -52,8 +52,8 @@ class Sequence { } } - isEmpty { iterate(null) ? false : true } - + isEmpty { iterate(null) ? false : true } + map(transformation) { new MapSequence(this, transformation) } where(predicate) { new WhereSequence(this, predicate) } diff --git a/builtin/io.wren b/builtin/io.wren index 06146d49..6b8df735 100644 --- a/builtin/io.wren +++ b/builtin/io.wren @@ -1,101 +1,101 @@ class IO { static print { - IO.writeString_("\n") + writeString_("\n") } static print(obj) { - IO.writeObject_(obj) - IO.writeString_("\n") + writeObject_(obj) + writeString_("\n") return obj } static print(a1, a2) { - printList_([a1, a2]) + printAll([a1, a2]) } static print(a1, a2, a3) { - printList_([a1, a2, a3]) + printAll([a1, a2, a3]) } static print(a1, a2, a3, a4) { - printList_([a1, a2, a3, a4]) + printAll([a1, a2, a3, a4]) } static print(a1, a2, a3, a4, a5) { - printList_([a1, a2, a3, a4, a5]) + printAll([a1, a2, a3, a4, a5]) } static print(a1, a2, a3, a4, a5, a6) { - printList_([a1, a2, a3, a4, a5, a6]) + printAll([a1, a2, a3, a4, a5, a6]) } static print(a1, a2, a3, a4, a5, a6, a7) { - printList_([a1, a2, a3, a4, a5, a6, a7]) + printAll([a1, a2, a3, a4, a5, a6, a7]) } static print(a1, a2, a3, a4, a5, a6, a7, a8) { - printList_([a1, a2, a3, a4, a5, a6, a7, a8]) + printAll([a1, a2, a3, a4, a5, a6, a7, a8]) } static print(a1, a2, a3, a4, a5, a6, a7, a8, a9) { - printList_([a1, a2, a3, a4, a5, a6, a7, a8, a9]) + printAll([a1, a2, a3, a4, a5, a6, a7, a8, a9]) } static print(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) { - printList_([a1, a2, a3, a4, a5, a6, a7, a8, a9, a10]) + printAll([a1, a2, a3, a4, a5, a6, a7, a8, a9, a10]) } static print(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) { - printList_([a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11]) + printAll([a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11]) } static print(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) { - printList_([a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12]) + printAll([a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12]) } static print(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) { - printList_([a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13]) + printAll([a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13]) } static print(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) { - printList_([a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14]) + printAll([a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14]) } static print(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) { - printList_([a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15]) + printAll([a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15]) } static print(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) { - printList_([a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16]) + printAll([a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16]) } - static printList_(objects) { - for (object in objects) IO.writeObject_(object) - IO.writeString_("\n") + static printAll(sequence) { + for (object in sequence) writeObject_(object) + writeString_("\n") } static write(obj) { - IO.writeObject_(obj) + writeObject_(obj) return obj } static read(prompt) { if (!(prompt is String)) Fiber.abort("Prompt must be a string.") - IO.write(prompt) - return IO.read + write(prompt) + return read() } static writeObject_(obj) { var string = obj.toString if (string is String) { - IO.writeString_(string) + writeString_(string) } else { - IO.writeString_("[invalid toString]") + writeString_("[invalid toString]") } } foreign static writeString_(string) foreign static clock foreign static time - foreign static read + foreign static read() } diff --git a/doc/site/core/io.markdown b/doc/site/core/io.markdown index 70b313c0..054eaf4e 100644 --- a/doc/site/core/io.markdown +++ b/doc/site/core/io.markdown @@ -7,38 +7,54 @@ The IO class can be used to read and write to and from the console. ### IO.**print**(objects...) -Prints any number of things to the console and then prints a newline -character. If you don't pass it a string, it will be converted to a string for -you. When passed multiple things, Wren outputs one after another. +Prints a series of objects to the console followed by a newline. Each object is +converted to a string by calling `toString` on it. This is overloaded to +support up to 16 objects. To pass more, use `printAll()`. + > IO.print("I like bananas") + I like bananas + > IO.print("Oranges", 10) + Oranges10 - > IO.print("I like bananas") - I like bananas - > IO.print("Oranges", 10) - Oranges10 - > +### IO.**printAll**(sequence) + +Iterates over [sequence] and prints each element, then prints a single newline +at the end. Each element is converted to a string by calling `toString` on it. + + > IO.printAll([1, [2, 3], 4]) + 1[2, 3]4 ### IO.**write**(object) -Prints a single thing to the console, but does not print a newline character -afterwards. If you pass it something that isn't a string, it will convert it to -a string. +Prints a single value to the console, but does not print a newline character +afterwards. Converts the value to a string by calling `toString` on it. - > IO.write(4 + 5) - 9> + > IO.write(4 + 5) + 9> In the above example, the result of `4 + 5` is printed, and then the prompt is printed on the same line because no newline character was printed afterwards. +### IO.**read**() + +Reads in a line of text from stdin. Note that the returned text includes the +trailing newline. + + > var name = IO.read() + John + > IO.print("Hello " + name + "!") + Hello John + ! + > + ### IO.**read**(prompt) -Reads in and returns a line of text from the console. Takes a single string to -be used as a prompt. Pass an empty string for no prompt. Note that the returned -line of text includes the newline character at the end. +Displays `prompt` then reads in a line of text from stdin. Note that the +returned text includes the trailing newline. - > var name = IO.read("Enter your name: ") - Enter your name: John - > IO.print("Hello " + name + "!") - Hello John - ! - > + > var name = IO.read("Enter your name: ") + Enter your name: John + > IO.print("Hello " + name + "!") + Hello John + ! + > diff --git a/src/vm/wren_io.c b/src/vm/wren_io.c index 8463ca8d..6e629833 100644 --- a/src/vm/wren_io.c +++ b/src/vm/wren_io.c @@ -13,104 +13,104 @@ static const char* ioLibSource = "class IO {\n" " static print {\n" -" IO.writeString_(\"\n\")\n" +" writeString_(\"\n\")\n" " }\n" "\n" " static print(obj) {\n" -" IO.writeObject_(obj)\n" -" IO.writeString_(\"\n\")\n" +" writeObject_(obj)\n" +" writeString_(\"\n\")\n" " return obj\n" " }\n" "\n" " static print(a1, a2) {\n" -" printList_([a1, a2])\n" +" printAll([a1, a2])\n" " }\n" "\n" " static print(a1, a2, a3) {\n" -" printList_([a1, a2, a3])\n" +" printAll([a1, a2, a3])\n" " }\n" "\n" " static print(a1, a2, a3, a4) {\n" -" printList_([a1, a2, a3, a4])\n" +" printAll([a1, a2, a3, a4])\n" " }\n" "\n" " static print(a1, a2, a3, a4, a5) {\n" -" printList_([a1, a2, a3, a4, a5])\n" +" printAll([a1, a2, a3, a4, a5])\n" " }\n" "\n" " static print(a1, a2, a3, a4, a5, a6) {\n" -" printList_([a1, a2, a3, a4, a5, a6])\n" +" printAll([a1, a2, a3, a4, a5, a6])\n" " }\n" "\n" " static print(a1, a2, a3, a4, a5, a6, a7) {\n" -" printList_([a1, a2, a3, a4, a5, a6, a7])\n" +" printAll([a1, a2, a3, a4, a5, a6, a7])\n" " }\n" "\n" " static print(a1, a2, a3, a4, a5, a6, a7, a8) {\n" -" printList_([a1, a2, a3, a4, a5, a6, a7, a8])\n" +" printAll([a1, a2, a3, a4, a5, a6, a7, a8])\n" " }\n" "\n" " static print(a1, a2, a3, a4, a5, a6, a7, a8, a9) {\n" -" printList_([a1, a2, a3, a4, a5, a6, a7, a8, a9])\n" +" printAll([a1, a2, a3, a4, a5, a6, a7, a8, a9])\n" " }\n" "\n" " static print(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) {\n" -" printList_([a1, a2, a3, a4, a5, a6, a7, a8, a9, a10])\n" +" printAll([a1, a2, a3, a4, a5, a6, a7, a8, a9, a10])\n" " }\n" "\n" " static print(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) {\n" -" printList_([a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11])\n" +" printAll([a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11])\n" " }\n" "\n" " static print(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) {\n" -" printList_([a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12])\n" +" printAll([a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12])\n" " }\n" "\n" " static print(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) {\n" -" printList_([a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13])\n" +" printAll([a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13])\n" " }\n" "\n" " static print(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) {\n" -" printList_([a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14])\n" +" printAll([a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14])\n" " }\n" "\n" " static print(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) {\n" -" printList_([a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15])\n" +" printAll([a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15])\n" " }\n" "\n" " static print(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) {\n" -" printList_([a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16])\n" +" printAll([a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16])\n" " }\n" "\n" -" static printList_(objects) {\n" -" for (object in objects) IO.writeObject_(object)\n" -" IO.writeString_(\"\n\")\n" +" static printAll(sequence) {\n" +" for (object in sequence) writeObject_(object)\n" +" writeString_(\"\n\")\n" " }\n" "\n" " static write(obj) {\n" -" IO.writeObject_(obj)\n" +" writeObject_(obj)\n" " return obj\n" " }\n" "\n" " static read(prompt) {\n" " if (!(prompt is String)) Fiber.abort(\"Prompt must be a string.\")\n" -" IO.write(prompt)\n" -" return IO.read\n" +" write(prompt)\n" +" return read()\n" " }\n" "\n" " static writeObject_(obj) {\n" " var string = obj.toString\n" " if (string is String) {\n" -" IO.writeString_(string)\n" +" writeString_(string)\n" " } else {\n" -" IO.writeString_(\"[invalid toString]\")\n" +" writeString_(\"[invalid toString]\")\n" " }\n" " }\n" "\n" " foreign static writeString_(string)\n" " foreign static clock\n" " foreign static time\n" -" foreign static read\n" +" foreign static read()\n" "}\n"; static void ioWriteString(WrenVM* vm) @@ -153,7 +153,7 @@ WrenForeignMethodFn wrenBindIOForeignMethod(WrenVM* vm, const char* className, if (strcmp(signature, "writeString_(_)") == 0) return ioWriteString; if (strcmp(signature, "clock") == 0) return ioClock; if (strcmp(signature, "time") == 0) return ioTime; - if (strcmp(signature, "read") == 0) return ioRead; + if (strcmp(signature, "read()") == 0) return ioRead; return NULL; } diff --git a/test/io/read_eof.wren b/test/io/read_eof.wren index 07fd65c1..db9045aa 100644 --- a/test/io/read_eof.wren +++ b/test/io/read_eof.wren @@ -1 +1 @@ -IO.write(IO.read) // expect: null +IO.write(IO.read()) // expect: null