【发布时间】:2017-06-19 20:37:33
【问题描述】:
是否可以重写下面的表达式,使(foo) 只出现一次?就目前而言,这并不可怕,但是这些对(foo) 的重复调用使代码难以阅读。
(cond
(a
(x)
(foo))
(b
(y)
(foo))
(else
(z)
(bar)))
【问题讨论】:
标签: scheme conditional
是否可以重写下面的表达式,使(foo) 只出现一次?就目前而言,这并不可怕,但是这些对(foo) 的重复调用使代码难以阅读。
(cond
(a
(x)
(foo))
(b
(y)
(foo))
(else
(z)
(bar)))
【问题讨论】:
标签: scheme conditional
我不确定这在技术上是“回答你的问题”,但我不同意重复调用 foo 会使代码“难以阅读”。事实上,我会声称它们使阅读变得更容易。具体来说,在重构版本中,您有带有尾随代码的条件分支(对 foo 的调用)。这意味着,作为一名读者,我在阅读条件句时必须记住,稍后会发生更多事情。更重要的是,查看重构代码中的foo,我们无法确定在此之前执行了哪些代码;原版没有这个问题。
当大块代码重复时,会使代码难以阅读和脆弱。当像这里一样重复单个调用时,通常会使代码更易于阅读,尤其是在函数具有有意义的名称时。
在这里,让我为你重新缩进:
(cond
[a (x)
(foo)]
[b (y)
(foo)]
[else (z)
(bar)])
【讨论】:
如果(foo) 的意思是复杂的,我建议:
(let ()
(define (f) (foo))
(cond
(a (x) (f))
(b (y) (f))
(else (z) (f))))
或
(let ((f (lambda () (foo))))
(cond
(a (x) (f))
(b (y) (f))
(else (z) (f))))
【讨论】:
(let ((f foo)) ...吗?
不一定更具可读性:)但这会起作用。
(cond ((or a b) ((cond (a (x)) (b (y))) (foo)) (else (z) (bar)))
【讨论】:
是的,
(cond
((cond
(a
(x)
#t)
(b
(y)
#t)
(else
(z)
#f)) (foo))
(else (bar)))
这不会引入额外的测试,以防a 或b 是复杂的表达式。
【讨论】:
另一种选择:
(let ((myfoo (lambda (x) (x) (foo))))
(cond (a (myfoo x))
(b (myfoo y))
(else (z) (bar))))
【讨论】: