X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fprelude.js;h=92144360cd23e13267ba29a8e135853655b60875;hb=fc17cd58e6bd60aa129bb879e3cf7452a944384b;hp=6f5feeaa9c15efcf60799a9dee9351b6a6e86ab7;hpb=e0edcccd4cdb6925e8d96fee9a6762aae8a2b25c;p=jscl.git diff --git a/src/prelude.js b/src/prelude.js index 6f5feea..9214436 100644 --- a/src/prelude.js +++ b/src/prelude.js @@ -4,6 +4,8 @@ var window = this; var nil; +var lisp = {}; + globalEval = eval; // Just an indirect eval function pv (x) { return x==undefined? nil: x; } @@ -51,14 +53,57 @@ function QIList(){ } } +// Return a new Array of strings, each either length-1, or length-2 (a UTF-16 surrogate pair). +function codepoints(string) { + return string.split(/(?![\udc00-\udfff])/); +} // Create and return a lisp string for the Javascript string STRING. function make_lisp_string (string){ - var array = string.split(""); - array.type = 'character' + var array = codepoints(string); + array.stringp = 1 return array; } +function char_to_codepoint(ch) { + if (ch.length == 1) { + return ch.charCodeAt(0); + } else { + var xh = ch.charCodeAt(0) - 0xD800; + var xl = ch.charCodeAt(1) - 0xDC00; + return 0x10000 + (xh << 10) + (xl); + } +} + +function char_from_codepoint(x) { + if (x <= 0xFFFF) { + return String.fromCharCode(x); + } else { + x -= 0x10000; + var xh = x >> 10; + var xl = x & 0x3FF; + return String.fromCharCode(0xD800 + xh) + String.fromCharCode(0xDC00 + xl); + } +} + +// if a char (JS string) has the same number of codepoints after .toUpperCase(), return that, else the original. +function safe_char_upcase(x) { + var xu = x.toUpperCase(); + if (codepoints(xu).length == 1) { + return xu; + } else { + return x; + } +} +function safe_char_downcase(x) { + var xl = x.toLowerCase(); + if (codepoints(xl).length == 1) { + return xl; + } else { + return x; + } +} + function xstring(x){ return x.join(''); } @@ -69,7 +114,7 @@ function Symbol(name, package_name){ } function lisp_to_js (x) { - if (typeof x == 'object' && 'length' in x && x.type == 'character') + if (typeof x == 'object' && 'length' in x && x.stringp == 1) return xstring(x); else if (typeof x == 'function'){ // Trampoline calling the Lisp function