3

スキームではset!、プライベート スコープを共有する 2 つ (またはそれ以上) の関数を作成するために使用できます。

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

または、3 番目の変数を使用して:

(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!、最初に を使用し、2 番目に残りの変数を使用しているため、洗練されていないように見えますfunctions。どちらもなしでこれを行う方法はありますか?

4

2 に答える 2

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

すべてのスキーム実装が定義値を提供するわけではありません。schemars 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 に答える