顶级功能私下共享范围

时间:2012-09-07 23:29:48

标签: functional-programming scheme

在方案中,可以使用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,因此这两个看起来都不够优雅。有没有办法在没有这个的情况下做到这一点?

2 个答案:

答案 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))))) 

http://community.schemewiki.org/?scheme-faq-macros