作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用著名的《如何设计程序》一书。更具体地说,第一版 (我有物理的)。
在第6章中,有一些关于结构的练习。其中之一,您需要模拟交通灯并使用效果(突变)来改变它们。
我指的是exercise 练习 6.2.5 关于功能next
这是假设给你交通灯的下一个颜色。
书中提供的答卷为:
(start 50 160)
(draw-solid-disk (make-posn 25 30) 20 'red)
(draw-circle (make-posn 25 80) 20 'yellow)
(draw-circle (make-posn 25 130) 20 'green)
; -------------------------------------------------------------------------
;; clear-bulb : symbol -> true
;; to clear one of the traffic bulbs
(define (clear-bulb color)
(cond
[(symbol=? color 'red)
(and (clear-solid-disk (make-posn 25 30) 20)
(draw-circle (make-posn 25 30) 20 'red))]
[(symbol=? color 'yellow)
(and (clear-solid-disk (make-posn 25 80) 20)
(draw-circle (make-posn 25 80) 20 'yellow))]
[(symbol=? color 'green)
(and (clear-solid-disk (make-posn 25 130) 20)
(draw-circle (make-posn 25 130) 20 'green))]))
;; tests
(clear-bulb 'red)
; -------------------------------------------------------------------------
;; draw-bulb : symbol -> true
;; to draw a bulb on the traffic light
(define (draw-bulb color)
(cond
[(symbol=? color 'red)
(draw-solid-disk (make-posn 25 30) 20 'red)]
[(symbol=? color 'yellow)
(draw-solid-disk (make-posn 25 80) 20 'yellow)]
[(symbol=? color 'green)
(draw-solid-disk (make-posn 25 130) 20 'green)]))
;; tests
(draw-bulb 'green)
; -------------------------------------------------------------------------
;; switch : symbol symbol -> true
;; to switch the traffic light from one color to the next
(define (switch from to)
(and (clear-bulb from)
(draw-bulb to)))
;; tests
(switch 'green 'yellow)
(switch 'yellow 'red)
; -------------------------------------------------------------------------
;; next : symbol -> symbol
;; to switch a traffic light's current color and to return the next one
(define (next current-color)
(cond
[(and (symbol=? current-color 'red) (switch 'red 'green))
'green]
[(and (symbol=? current-color 'yellow) (switch 'yellow 'red))
'red]
[(and (symbol=? current-color 'green) (switch 'green 'yellow))
'yellow]))
(next 'red)
(next 'green)
(next 'yellow)
(next 'red)
在下一个函数中,我做了一个类似的事情,在提供的测试中取得了相同的结果:
(define (next current-color)
(cond
[(symbol=? current-color 'red) (switch 'red 'green)]
[(symbol=? current-color 'yellow) (switch 'yellow 'red)]
[(symbol=? current-color 'green) (switch 'green 'yellow)]))
与书中的答案不同,我的代码不使用
and
并且不会出现松散的单个符号(例如“红色”)。
最佳答案
Racket 作为一种 Scheme,是一个 expression-oriented language .这意味着复合表达式中的最后一个表达式是整个表达式的值。
这包括带引号的符号。它的值,即符号,是返回值。
函数调用 (next current-color)
切换交通灯的颜色并返回一个指示交通灯新颜色的符号:
;; next : symbol -> symbol
您的代码切换颜色并返回
true
(根据
switch
的规范):
;; switch : symbol symbol -> true
;; your-next : symbol -> true
这改变了函数
next
的方式可以使用。有了这本书的设计,我们可以写
....
(let loop ( ... )
.....
(let ((current-color (next current-color)))
......
))
....
对于您的设计,这种自然风格的循环代码是不可能的。
关于types - 为什么《如何设计程序》这本书在他们的答卷上选择了这种方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66889207/
我是一名优秀的程序员,十分优秀!