
;; TODO: how to handle internal (define)s?

(define *new-defines* '())
(define *default-filename* "saved-image.ss")

(if (not (module-bound? (current-module) 'ur-define))
  (define ur-define define))

(define-macro (define . args)
  `(begin (ur-define ,@args)
	  (mark-source-info! ',(if (pair? (car args)) (caar args) (car args))
			     ',(cons 'define args))))

(define (mark-source-info! sym defn)
  (if (current-load-port)
    (let ((p (current-load-port)))
      (set-symbol-property! sym 'file (port-filename p))
      (set-symbol-property! sym 'line (port-line p)))
    (set! *new-defines* (cons sym *new-defines*)))
  (set-symbol-property! sym 'definition defn))

(define (new-defines)
  (map (lambda (sym) (symbol-property sym 'definition)) *new-defines*))

(define (save-new-defines filename)
  (let ((defs (reverse (new-defines)))
	(p (open-file filename "a")))
    (for-each (lambda (defn) (write defn p) (newline p)) defs)
    (close-port p)
    (set! *new-defines* '())
    (load filename)))

(define (save) (save-new-defines *default-filename*))

(define (source-file obj) (symbol-property obj 'file))
(define (source-line obj) (symbol-property obj 'line))
(define (definition obj) (symbol-property obj 'definition))

(define (edit obj)
  (let ((filename (source-file obj))
	(line (source-line obj))
	(editor (or (getenv "VISUAL") (getenv "EDITOR") "vi")))
    (if (not filename) (error "edit: no filename associated with" obj))
    (system* editor (string-append "+" (number->string line)) filename)
    (load filename)))

