如何根据Scheme/Racket中的条件实际定义很多东西?

Wys*_*ard 6 scheme racket

我在Racket工作但据我所知,这在一般情况下就是这个案例; 你不能做这样的事情,因为我们试图在表达式上下文中定义一些东西:

(if condition
    (define x "do a backflip")
    (define x "do a barrel roll"))
Run Code Online (Sandbox Code Playgroud)

现在针对这个特例,我可以做一些这样的事情:

(define x
  (if condition
      "do a backflip"
      "do a barrel roll"))
Run Code Online (Sandbox Code Playgroud)

但如果你有很多不同的东西需要定义,这真的很糟糕,因为而不是

(if condition
    (begin (define x "do a backflip")
           (define y "awesome")
           (define z "shoot me"))
    (begin (define x "do a barrel roll")
           (define y "nice")
           (define z "give me sweet release")))
Run Code Online (Sandbox Code Playgroud)

我们得到

(define x                                                                                                                                                                                                                                      
  (if condition
      "do a backflip"
      "do a barrel roll"))
(define y                                                                                                                                                                                                                                      
  (if condition
      "awesome"
      "nice"))
(define z                                                                                                                                                                                                                                      
  (if condition
      "shoot me"
      "give me sweet release"))
Run Code Online (Sandbox Code Playgroud)

哪个不是DRY,我们不断重复测试condition.其结果是,如果不是测试condition,我们要检查other-condition,我们必须做出改变n时间n的事情量被定义.有没有更好的方法来做到这一点,如果是这样的话:怎么样?

soe*_*ard 5

用途define-values:

(define-values (x y z) (if condition
                           (values "do a backflip"    "awesome" "shoot me")
                           (values "do a barrel roll" "nice"    "give me sweet release")))
Run Code Online (Sandbox Code Playgroud)