0

In general I want write code in REPL and sometimes save all defined by myself symbols to file.

For example - after typing in REPL:

]=> (define (square x) (* x x))
]=> (define sizes '(5 10 15))

I need to call something to receive a list of previously defined objects. In this case it can be represented in this way:

]=> (define get-user-defined-environment 
      (list (list 'sizes sizes) (list 'square square)))

To be able then call something like this:

]=> (map 
      (lambda (lst) (begin 
         (display "(define ") 
         (pp (first lst)) 
         (pp (second lst)) 
         (display ")\n\n"))) 
      get-user-defined-environment)

(define sizes
(5 10 15)
)

(define square
(named-lambda (square x)
  (* x x))
)

And, maybe, save output to file somehow.

So, what could be this get-user-defined-environment ?

Aleksei Gutikov
  • 343
  • 4
  • 10

2 Answers2

1

There isn't something in standard Scheme that lets you record the environment. You can however define your own define-like syntax that does it for you.

> (define *env* '())
> (define-syntax def&rec
    (syntax-rules ()
      ((_ name init)
       (define name
         (let ((value init))
           (set! *env* (cons (cons 'name value) *env*))
           value)))))
> (def&rec foo 1)
> (def&rec bar (lambda (x) x))
> *env*
((bar . #<procedure value>) (foo . 1))

If you intend to write this to a file, like with the expectation of reading it back in, you will want to record the init form, not value in the syntax above. Here is another syntactic form to record the init:

> (define-syntax def&rec2
    (syntax-rules ()
      ((_ name init)
       (define name
         (let ((value init))
           (set! *env* (cons (list 'name value 'init) *env*))
           value)))))
> (def&rec2 equal-to (lambda (x) (lambda (y) (equal? x y))))
> *env*
((equal-to #<procedure value>
   (lambda (x) (lambda (y) (equal? x y))))
  (bar . #<procedure value>) (foo . 1))
GoZoner
  • 67,920
  • 20
  • 95
  • 145
0

Thanks to uselpa pointed to How can find all functions and bounded symbols in an "environment"

(environment-bound-names (the-environment)) - returns a list of user-defined names.

Then (environment-lookup (the-environment) name) - returns value of a name in current environment.

Here is the way:

]=> (define (p1 name env) (begin (display "(define ") (pp name) (pp (environment-lookup env name)) (display ")\n\n")))

]=> (define (p2 lst env) (for-each (lambda (name) (p1 name env)) lst))

]=> (p2 (reverse (environment-bound-names (the-environment))) (the-environment))

(define p1
(named-lambda (p1 name env)
  (display "(define ")
  (pp name)
  (pp (environment-lookup env name))
  (display ")\n\n"))
)

(define p2
(named-lambda (p2 lst env)
  (for-each (lambda (name) (p1 name env)) lst))
)
Community
  • 1
  • 1
Aleksei Gutikov
  • 343
  • 4
  • 10