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

然而,由于set!在第一个和第二个中使用了剩余变量,这两个似乎都不优雅functions。有没有办法做到这一点?

4

2 回答 2

5
(define-values (f1 f2)
  (let ((private values) ...)
    (values (lambda ...)
            (lambda ...))))
于 2012-09-08T00:11:08.587 回答
1

并非每个方案实现都提供定义值。计划者 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

于 2012-10-02T05:02:21.007 回答