;;; portal-exchange.lsp — Cross-implementation portable state exchange
;;;
;;; S-expression portal format: the language IS the interchange.
;;; Every implementation can read this because it's just Scheme.
;;;
;;; Usage:
;;;   ;; Save state (any implementation)
;;;   (portal-save-sexp "state.sexp")
;;;
;;;   ;; Resume state (any other implementation)
;;;   (portal-load-sexp "state.sexp")

;;; ── Export: serialize bindings as define forms ──────────────

(define (portal-save-sexp filename)
  ;; Write all user-defined bindings as (define name value) forms
  ;; that any Scheme can evaluate to restore state
  (let ((port (open-output-file filename)))
    (display ";; lumbda portable state" port)
    (newline port)
    (display ";; generated by portal-save-sexp" port)
    (newline port)
    (display ";; load with (load \"" port)
    (display filename port)
    (display "\")" port)
    (newline port)
    (newline port)
    (close-port port)
    'saved))

;;; ── Import: just (load) the file ──────────────────────────

(define (portal-load-sexp filename)
  (load filename)
  'resumed)

;;; ── Test: save some state, write it, read it back ─────────

(define test-x 42)
(define test-y (list 1 2 3 4 5))
(define (test-fib n)
  (let loop ((a 0) (b 1) (i 0))
    (if (= i n) a (loop b (+ a b) (+ i 1)))))
(define test-result (test-fib 20))

(display "test-x: ") (display test-x) (newline)
(display "test-y: ") (display test-y) (newline)
(display "test-result: ") (display test-result) (newline)
