;; ========================================================================== ;; content.sx — Content-addressed computation ;; ;; Hash frozen SX to a content identifier. Store and retrieve by CID. ;; The content IS the address — same SX always produces the same CID. ;; ;; This is a library built on top of freeze.sx. It is NOT part of the ;; core evaluator. Load order: evaluator.sx → freeze.sx → content.sx ;; ;; Uses an in-memory content store. Applications can persist to ;; localStorage or IPFS by providing their own store backend. ;; ========================================================================== (define content-store (dict)) (define content-hash :effects [] (fn (sx-text) ;; djb2 hash → hex string. Simple, deterministic, fast. ;; Real deployment would use SHA-256 / multihash. (let ((hash 5381)) (for-each (fn (i) (set! hash (mod (+ (* hash 33) (char-code-at sx-text i)) 4294967296))) (range 0 (len sx-text))) (to-hex hash)))) (define content-put :effects [mutation] (fn (sx-text) (let ((cid (content-hash sx-text))) (dict-set! content-store cid sx-text) cid))) (define content-get :effects [] (fn (cid) (get content-store cid))) ;; Freeze a scope → store → return CID (define freeze-to-cid :effects [mutation] (fn (scope-name) (let ((sx-text (freeze-to-sx scope-name))) (content-put sx-text)))) ;; Thaw from CID → look up → restore (define thaw-from-cid :effects [mutation] (fn (cid) (let ((sx-text (content-get cid))) (when sx-text (thaw-from-sx sx-text) true))))