"Definitivo" Schema REPL definizioni: come salvarle?

4

C'è un modo per mostrare e salvare tutte le definizioni "finali" inserite in un REPL di schema in un file di testo?

Di ', se ho definito in REPL:

    (define (increase x) (+ 1 x))
    (define (multbytwo x) (* 3 x)) ; let us say this was an error
    (define (multbytwo x) (* 2 x))

Voglio salvarlo in un file .scm con il contenuto:

    (define (increase x) (+ 1 x))
    (define (multbytwo x) (* 2 x))
  • vale a dire. la funzione multbytwo che viene definita erraneosamente deve essere "dimenticata" a causa della ridefinizione. È possibile?
posta Aeneas 13.05.2013 - 10:23
fonte

1 risposta

2

Nessuno che io conosca. Vi sono tuttavia molti Lisp che possono salva la sua immagine in modo che tu possa iniziare con tutte le definizioni. Però non sarai in grado di vedere effettivamente le definizioni.

Avrei mantenuto le mie definizioni in un file (o nell'IDE come in DrRacket) e ho avviato il repl con il caricamento di quel file. Quando cambi definizione, copia / incolla di nuovo nel tuo file di definizione quando sei soddisfatto.

In alternativa, potresti fare un piccolo REPL:

;; These are outside in case we break out of the REPL
(define env '())
(define (print-env)
  (newline)
  (for-each (lambda (x) (display (cdr x)) (newline)) env)
  (newline))

(define (repl)
  (define (define? expr)
    (and (pair? expr)
         (or (eq? 'define (car expr))
             (eq? 'set! (car expr)))))

  (define (define-name expr)
    (if (pair? (cadr expr))
        (caadr expr)
        (cadr expr)))

  (define (extend-env name expr)
    (let ((found (assq name env)))
      (if found
          (set-cdr! (car found) expr)
          (set! env (cons (cons name expr) env)))))

  (let ((expr (read)))
    (if (define? expr)
        (let ((name (define-name expr)))
          (eval expr (interaction-environment))
          (extend-env name expr)
          (repl))
        (let ()
              (display (eval expr (interaction-environment)))
              (newline)
              (repl)))))

(display "Outer REPL: If an error occurs, rerun with (repl)\nIn both REPL and outside yo may print definitions by calling (print-env)\n")
(repl)

Questo è molto grezzo. Al primo errore uscirà dal ciclo. Tuttavia, in sostituzione e fuori luogo, è possibile stampare le definizioni eseguendo (print-env).

    
risposta data 16.05.2013 - 01:08
fonte

Leggi altre domande sui tag