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 vectorLength = PRIMITIVES["vector-length"];
|
||||||
var vectorRef = PRIMITIVES["vector-ref"];
|
var vectorRef = PRIMITIVES["vector-ref"];
|
||||||
var reverse = PRIMITIVES["reverse"];
|
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 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; }
|
function append_b(arr, x) { arr.push(x); return arr; }
|
||||||
var apply = function(f, args) {
|
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 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 isNil(x) { return x === NIL || x === null || x === undefined; }
|
||||||
function isSxTruthy(x) { return x !== false && !isNil(x); }
|
function isSxTruthy(x) { return x !== false && !isNil(x); }
|
||||||
@@ -810,6 +810,8 @@
|
|||||||
var vectorLength = PRIMITIVES["vector-length"];
|
var vectorLength = PRIMITIVES["vector-length"];
|
||||||
var vectorRef = PRIMITIVES["vector-ref"];
|
var vectorRef = PRIMITIVES["vector-ref"];
|
||||||
var reverse = PRIMITIVES["reverse"];
|
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 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; }
|
function append_b(arr, x) { arr.push(x); return arr; }
|
||||||
var apply = function(f, args) {
|
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); };
|
var trampoline = function(val) { return (isSxTruthy(isThunk(val)) ? evalExpr(thunkExpr(val), thunkEnv(val)) : val); };
|
||||||
PRIMITIVES["trampoline"] = trampoline;
|
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) ===
|
// === Transpiled from freeze (serializable state boundaries) ===
|
||||||
|
|
||||||
|
|||||||
@@ -4754,3 +4754,25 @@
|
|||||||
(fn
|
(fn
|
||||||
(val)
|
(val)
|
||||||
(if (thunk? val) (eval-expr (thunk-expr val) (thunk-env val)) 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