我在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的事情量被定义.有没有更好的方法来做到这一点,如果是这样的话:怎么样?
用途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)