HiveBrain v1.2.0
Get Started
← Back to all entries
patternMinor

Simplifying Dr.Racket alien code

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
coderacketsimplifyingalien

Problem

I am using Dr.Racket, Intermediate Student with Lambda. I was wondering if there was any way I can simplify this code using any sort of method like lambda, abstraction, map, filter, etc.

; 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)
 ( 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)))]))

Solution

; alien-at-edge?: alien --> boolean
(define (alien-at-edge? an-alien)
(or (alien-at-right-edge? an-alien)
(alien-at-left-edge? an-alien)))


Not much to do here but don't forget about indentation to make your code readable.

; 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)))]))


This pattern occurs a lot in functional programming: produce a value (a boolean here) by applying a function (or here) to your list. You can rewrite your function as:

; any-alien-at-edge?: loa --> boolean 
(define (any-alien-at-edge? a-loa) 
  (foldl or false a-loa)


You can also use ormap if foldl is hard to understand.

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


Watch out for indentation and trailing spaces.

;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)))]))


Those ones can also be implemented using foldl. Try it out!

Code Snippets

; 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)))]))
; any-alien-at-edge?: loa --> boolean 
(define (any-alien-at-edge? a-loa) 
  (foldl or false 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)))]))

Context

StackExchange Code Review Q#37576, answer score: 2

Revisions (0)

No revisions yet.