diff --git a/compiler/kernel-primitives.rkt b/compiler/kernel-primitives.rkt index 01a6e75..ecd1216 100644 --- a/compiler/kernel-primitives.rkt +++ b/compiler/kernel-primitives.rkt @@ -108,6 +108,8 @@ 'hash-remove! 'hash-remove 'equal-hash-code + + 'string-copy )) (define-predicate KernelPrimitiveName? KernelPrimitiveName) diff --git a/js-assembler/runtime-src/baselib-primitives.js b/js-assembler/runtime-src/baselib-primitives.js index 867fdfd..4c51476 100644 --- a/js-assembler/runtime-src/baselib-primitives.js +++ b/js-assembler/runtime-src/baselib-primitives.js @@ -791,7 +791,15 @@ if (M.a === 3) { end = baselib.numbers.toFixnum(checkNatural(M, 'substring', 2)); } - return str.substring(start, end); + return baselib.strings.makeMutableString((str.substring(start, end)).split("")); + }); + + installPrimitiveProcedure( + 'string-copy', + 1, + function(M) { + var str = checkString(M, 'substring', 0).toString(); + return baselib.strings.makeMutableString(str.substring(0, str.length).split("")); }); diff --git a/js-assembler/runtime-src/baselib-strings.js b/js-assembler/runtime-src/baselib-strings.js index a22dbc5..13bc786 100644 --- a/js-assembler/runtime-src/baselib-strings.js +++ b/js-assembler/runtime-src/baselib-strings.js @@ -96,7 +96,7 @@ }; Str.prototype.replace = function (expr, newStr) { - return Str.fromString( this.toString().replace(expr, newStr) ); + return Str.fromString(this.toString().replace(expr, newStr) ); }; @@ -117,11 +117,11 @@ }; Str.prototype.toUpperCase = function () { - return Str.fromString( this.chars.join("").toUpperCase() ); + return Str.fromString(this.chars.join("").toUpperCase() ); }; Str.prototype.toLowerCase = function () { - return Str.fromString( this.chars.join("").toLowerCase() ); + return Str.fromString(this.chars.join("").toLowerCase() ); }; Str.prototype.match = function (regexpr) { diff --git a/lang/kernel.rkt b/lang/kernel.rkt index 337735b..334ecff 100644 --- a/lang/kernel.rkt +++ b/lang/kernel.rkt @@ -431,6 +431,7 @@ box? string-ci<=? string-ci>=? + string-copy substring string-append string->list diff --git a/tests/more-tests/dots-should-be-syntax-error.rkt b/tests/more-tests/dots-should-be-syntax-error.rkt new file mode 100644 index 0000000..990de08 --- /dev/null +++ b/tests/more-tests/dots-should-be-syntax-error.rkt @@ -0,0 +1,3 @@ +#lang planet dyoo/whalesong/cs019 + +.. ;; should raise a teaching syntax error diff --git a/tests/more-tests/string-tests.expected b/tests/more-tests/string-tests.expected index e6790f6..87d3b19 100644 --- a/tests/more-tests/string-tests.expected +++ b/tests/more-tests/string-tests.expected @@ -11,6 +11,7 @@ "" "l" "lo" +"hello world" "" "hello" "" diff --git a/tests/more-tests/string-tests.rkt b/tests/more-tests/string-tests.rkt index 12a643d..e033727 100644 --- a/tests/more-tests/string-tests.rkt +++ b/tests/more-tests/string-tests.rkt @@ -14,6 +14,8 @@ (substring "hello world" 3 4) (substring "hello world" 3 5) +(string-copy "hello world") + (list->string '()) (list->string '(#\h #\e #\l #\l #\o)) diff --git a/version.rkt b/version.rkt index 15e32b5..11184ff 100644 --- a/version.rkt +++ b/version.rkt @@ -6,4 +6,4 @@ (provide version) (: version String) -(define version "1.62") +(define version "1.64")