首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简化Dr.Racket外星码

简化Dr.Racket外星码
EN

Code Review用户
提问于 2013-12-17 08:12:02
回答 2查看 187关注 0票数 3

我使用的是Dr.Racket,中级学生和Lambda。我想知道是否有任何方法可以简化这段代码,比如lambda、抽象、映射、过滤器等等。

代码语言:javascript
复制
 ; alien-at-edge?: alien --> boolean
(define (alien-at-edge? an-alien)
(or (alien-at-right-edge? an-alien)
(alien-at-left-edge? an-alien)))    

; any-alien-at-edge?: loa --> boolean 
(define (any-alien-at-edge? a-loa) 
(cond [(empty? a-loa) false] 
[else (or (alien-at-edge? (first a-loa)) 
      (any-alien-at-edge? (rest a-loa)))])) 

;alien-at-left-edge?: alien --> boolean
(define (alien-at-left-edge? an-alien)
 (<= (- (posn-x an-alien) ALIEN-DELTA-X) alien-half))  

;alien-at-right-edge?: alien --> boolean
(define (alien-at-right-edge? an-alien)
(>= (+ (posn-x an-alien) ALIEN-DELTA-X) (- WIDTH alien-half))) 

;any-alien-at-right-edge?: loa --> boolean 
(define (any-alien-at-right-edge? a-loa) 
(cond [(empty? a-loa) false] 
[else (or (alien-at-right-edge? (first a-loa)) 
      (any-alien-at-right-edge? (rest a-loa)))])) 

;any-alien-at-left-edge?: loa --> boolean 
(define (any-alien-at-left-edge? a-loa) 
(cond [(empty? a-loa) false] 
[else (or (alien-at-left-edge? (first a-loa)) 
      (any-alien-at-left-edge? (rest a-loa)))]))
EN

回答 2

Code Review用户

发布于 2013-12-17 09:08:34

代码语言:javascript
复制
 ; alien-at-edge?: alien --> boolean
(define (alien-at-edge? an-alien)
(or (alien-at-right-edge? an-alien)
(alien-at-left-edge? an-alien)))

这里没有什么可做的,但不要忘记缩进,以使您的代码可读性。

代码语言:javascript
复制
; any-alien-at-edge?: loa --> boolean 
(define (any-alien-at-edge? a-loa) 
(cond [(empty? a-loa) false] 
[else (or (alien-at-edge? (first a-loa)) 
      (any-alien-at-edge? (rest a-loa)))]))

这种模式在函数式编程中经常发生:通过将函数(此处为or)应用到列表中来生成一个值(此处为布尔值)。您可以将您的函数重写为:

代码语言:javascript
复制
; any-alien-at-edge?: loa --> boolean 
(define (any-alien-at-edge? a-loa) 
  (foldl or false a-loa)

如果ormap很难理解,也可以使用foldl

代码语言:javascript
复制
;alien-at-left-edge?: alien --> boolean
(define (alien-at-left-edge? an-alien)
 (<= (- (posn-x an-alien) ALIEN-DELTA-X) alien-half))  

;alien-at-right-edge?: alien --> boolean
(define (alien-at-right-edge? an-alien)
(>= (+ (posn-x an-alien) ALIEN-DELTA-X) (- WIDTH alien-half))) 

注意缩进和尾随空格。

代码语言:javascript
复制
;any-alien-at-right-edge?: loa --> boolean 
(define (any-alien-at-right-edge? a-loa) 
(cond [(empty? a-loa) false] 
[else (or (alien-at-right-edge? (first a-loa)) 
      (any-alien-at-right-edge? (rest a-loa)))])) 

;any-alien-at-left-edge?: loa --> boolean 
(define (any-alien-at-left-edge? a-loa) 
(cond [(empty? a-loa) false] 
[else (or (alien-at-left-edge? (first a-loa)) 
      (any-alien-at-left-edge? (rest a-loa)))]))

这些功能也可以使用foldl实现。试试看!

票数 2
EN

Code Review用户

发布于 2014-08-14 09:57:50

可以在一个定义中重写所有的任意函数,如下所示

代码语言:javascript
复制
(define (any predicate? a-loa) 
     (cond [(empty? a-loa) false] 
           [else (or (predicate? (first a-loa)) 
                     (any predicate? (rest a-loa)))]))

标准库中也有一个findf函数。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/37576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档