2012-09-07 88 views
3

在方案,有可能使用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)) 

然而,這兩種似乎不雅,由於在第一和第二左過可變functions使用set!。有沒有辦法做到這一點沒有?

回答

5
(define-values (f1 f2) 
    (let ((private values) ...) 
    (values (lambda ...) 
      (lambda ...)))) 
+0

謝謝!只有一件事,第二行應該是'(讓((私人值)...)' – ikdc

1

不是每個方案實現都提供define-values。有一個在陰謀家維基宏定義:

(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