spec: gensym + symbol interning — *gensym-counter*, string->symbol, symbol->string, intern
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1663,6 +1663,8 @@ PLATFORM_JS_POST = '''
|
||||
var vectorLength = PRIMITIVES["vector-length"];
|
||||
var vectorRef = PRIMITIVES["vector-ref"];
|
||||
var reverse = PRIMITIVES["reverse"];
|
||||
var stringToSymbol = PRIMITIVES["string->symbol"];
|
||||
var symbolToString = PRIMITIVES["symbol->string"];
|
||||
function zip(a, b) { var r = []; for (var i = 0; i < Math.min(a.length, b.length); i++) r.push([a[i], b[i]]); return r; }
|
||||
function append_b(arr, x) { arr.push(x); return arr; }
|
||||
var apply = function(f, args) {
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -31,7 +31,7 @@
|
||||
// =========================================================================
|
||||
|
||||
var NIL = Object.freeze({ _nil: true, toString: function() { return "nil"; } });
|
||||
var SX_VERSION = "2026-05-01T10:16:10Z";
|
||||
var SX_VERSION = "2026-05-01T10:26:58Z";
|
||||
|
||||
function isNil(x) { return x === NIL || x === null || x === undefined; }
|
||||
function isSxTruthy(x) { return x !== false && !isNil(x); }
|
||||
@@ -810,6 +810,8 @@
|
||||
var vectorLength = PRIMITIVES["vector-length"];
|
||||
var vectorRef = PRIMITIVES["vector-ref"];
|
||||
var reverse = PRIMITIVES["reverse"];
|
||||
var stringToSymbol = PRIMITIVES["string->symbol"];
|
||||
var symbolToString = PRIMITIVES["symbol->string"];
|
||||
function zip(a, b) { var r = []; for (var i = 0; i < Math.min(a.length, b.length); i++) r.push([a[i], b[i]]); return r; }
|
||||
function append_b(arr, x) { arr.push(x); return arr; }
|
||||
var apply = function(f, args) {
|
||||
@@ -3570,6 +3572,33 @@ PRIMITIVES["eval-expr"] = evalExpr;
|
||||
var trampoline = function(val) { return (isSxTruthy(isThunk(val)) ? evalExpr(thunkExpr(val), thunkEnv(val)) : val); };
|
||||
PRIMITIVES["trampoline"] = trampoline;
|
||||
|
||||
// *gensym-counter*
|
||||
var _gensymCounter_ = 0;
|
||||
PRIMITIVES["*gensym-counter*"] = _gensymCounter_;
|
||||
|
||||
// gensym
|
||||
var gensym = function() { var args = Array.prototype.slice.call(arguments, 0); return (function() {
|
||||
var prefix = (isSxTruthy(isEmpty(args)) ? "g" : (String(first(args))));
|
||||
return ((_gensymCounter_ = (_gensymCounter_ + 1)), makeSymbol((String(prefix) + String(_gensymCounter_))));
|
||||
})(); };
|
||||
PRIMITIVES["gensym"] = gensym;
|
||||
|
||||
// string->symbol
|
||||
var stringToSymbol = function(s) { return makeSymbol(s); };
|
||||
PRIMITIVES["string->symbol"] = stringToSymbol;
|
||||
|
||||
// symbol->string
|
||||
var symbolToString = function(sym) { return symbolName(sym); };
|
||||
PRIMITIVES["symbol->string"] = symbolToString;
|
||||
|
||||
// intern
|
||||
var intern = function(s) { return makeSymbol(s); };
|
||||
PRIMITIVES["intern"] = intern;
|
||||
|
||||
// symbol-interned?
|
||||
var symbolInterned_p = function(sym) { return true; };
|
||||
PRIMITIVES["symbol-interned?"] = symbolInterned_p;
|
||||
|
||||
|
||||
// === Transpiled from freeze (serializable state boundaries) ===
|
||||
|
||||
|
||||
@@ -4754,3 +4754,25 @@
|
||||
(fn
|
||||
(val)
|
||||
(if (thunk? val) (eval-expr (thunk-expr val) (thunk-env val)) val)))
|
||||
|
||||
;; Phase 12: gensym + symbol interning
|
||||
|
||||
(define *gensym-counter* 0)
|
||||
|
||||
(define
|
||||
gensym
|
||||
(fn
|
||||
(&rest args)
|
||||
(let
|
||||
((prefix (if (empty? args) "g" (str (first args)))))
|
||||
(do
|
||||
(set! *gensym-counter* (+ *gensym-counter* 1))
|
||||
(make-symbol (str prefix *gensym-counter*))))))
|
||||
|
||||
(define string->symbol (fn (s) (make-symbol s)))
|
||||
|
||||
(define symbol->string (fn (sym) (symbol-name sym)))
|
||||
|
||||
(define intern (fn (s) (make-symbol s)))
|
||||
|
||||
(define symbol-interned? (fn (sym) true))
|
||||
|
||||
Reference in New Issue
Block a user