Scheme 如何在方案中打印自定义环境?

Scheme 如何在方案中打印自定义环境?,scheme,environment,Scheme,Environment,一般来说,我希望用REPL编写代码,有时将自己定义的所有符号保存到文件中 例如-在REPL中键入后: ]=> (define (square x) (* x x)) ]=> (define sizes '(5 10 15)) 我需要调用一些东西来接收以前定义的对象列表。 在这种情况下,可以用以下方式表示: ]=> (define get-user-defined-environment (list (list 'sizes sizes) (list 'squar

一般来说,我希望用REPL编写代码,有时将自己定义的所有符号保存到文件中

例如-在REPL中键入后:

]=> (define (square x) (* x x))
]=> (define sizes '(5 10 15))
我需要调用一些东西来接收以前定义的对象列表。 在这种情况下,可以用以下方式表示:

]=> (define get-user-defined-environment 
      (list (list 'sizes sizes) (list 'square square)))
然后可以这样称呼:

]=> (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))
)
并且,可能会以某种方式将输出保存到文件中


那么,这个获取用户定义的环境可能是什么?

标准方案中没有允许您记录环境的内容。但是,您可以定义自己的
定义类似于为您定义的语法

> (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))

感谢uselpa指出的

(环境绑定名称(环境))-返回用户定义名称的列表

然后(环境查找(环境)名称)-返回当前环境中名称的值

方法如下:

]=> (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))
)

您使用的是哪个实现?名为dev scheme/mit-scheme-c的包,据我所知,它是mit/GNU scheme。请参阅和
]=> (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))
)