如何评估球拍/方案中非确定性(随机顺序)的条件?

问题描述 投票:0回答:1

如何不确定地评估此代码?

(cond (correct-1? do-thing-1)
      (correct-2? do-thing-2)
      (correct-3? do-thing-3))

例如,如果 Correct-1? Correct-3? 为 true,那么我有时想执行 do-thing-1,有时执行 do-thing-3。换句话说:条件声明的顺序并不重要,是随机决定的。

scheme racket
1个回答
0
投票

出于显而易见的原因,这样的宏不能有

else
子句 -

(define-syntax rand-cond
  (syntax-rules ()
    ((rand-cond (test expr ...) clause ...)
     (shuffle-eval '((test expr ...) clause ...)))))

我们可以将

shuffle-eval
写为 -

(define (shuffle-eval clauses)
  (call/cc
   (lambda (exit)
     (for-each 
      (lambda (clause)
        (let ((test (car clause))
              (exprs (cdr clause))) 
          (when (eval test) ;; eval test
            (exit (eval `(begin ,@exprs)))))) ;; eval exprs
      (shuffle clauses))     
     #f))) ;; else false

让我们尝试一下 -

(rand-cond
 ((> 5 10) (display "5 is greater than 10"))
 ((< 5 10) (display "5 is less than 10"))
 ((= 5 5) (display "5 is equal to 5")))

有时显示“等于”,有时显示“较少”。从不显示“更大”。

© www.soinside.com 2019 - 2024. All rights reserved.