在方案中,可以使用set!
创建两个(或更多)函数,这些函数在它们之间共享一个私有范围:
(define f1 #f) ; or any other "undefined" value
(define f2 #f)
(let ((private some-value) (another-private some-other-value))
(set! f1 (lambda ... <use of private variables> ...))
(set! f2 (lambda ... <use of private variables> ...)))
或使用第三个变量:
(define functions
(let ((private some-value) (another-private some-other-value))
(list (lambda ... <use of private variables> ...)
(lambda ... <use of private variables> ...))))
(define f1 (car functions))
(define f2 (cadr functions))
然而,由于在第一个中使用了set!
而在第二个中使用了左上变量functions
,因此这两个看起来都不够优雅。有没有办法在没有这个的情况下做到这一点?
答案 0 :(得分:5)
(define-values (f1 f2)
(let ((private values) ...)
(values (lambda ...)
(lambda ...))))
答案 1 :(得分:1)
并非每个方案实现都提供定义值。在schemers wiki上有一个宏定义:
(define-syntax define-values
(syntax-rules ()
((define-values () exp)
(call-with-values (lambda () exp) (lambda () 'unspecified)))
((define-values (var . vars) exp)
(begin
(define var (call-with-values (lambda () exp) list))
(define-values vars (apply values (cdr var)))
(define var (car var))))
((define-values var exp)
(define var (call-with-values (lambda () exp) list)))))