如何不确定地评估此代码?
(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。换句话说:条件声明的顺序并不重要,是随机决定的。
出于显而易见的原因,这样的宏不能有
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")))
有时显示“等于”,有时显示“较少”。从不显示“更大”。