Scheme 如何在方案中打印自定义环境?
一般来说,我希望用REPL编写代码,有时将自己定义的所有符号保存到文件中 例如-在REPL中键入后: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
]=> (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))
)