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:
2026-05-01 10:28:18 +00:00
parent 130d4d7c18
commit edf4e525f8
4 changed files with 55 additions and 2 deletions

View File

@@ -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) ===