(local { : view } (require :fennel)) (macro expect [text actual expected] `(let [actual# ,actual] (or (match actual# ,expected true _# false) (assert false (view { :text ,text :expected ,expected :actual actual# }))))) (fn command [rover commands] (match rover.direction :n {:x 0 :y (+ rover.y 1) :direction :n} :s {:x 0 :y (- rover.y 1) :direction :s})) (fn rover [x y direction] {: x : y : direction : command }) (let [r (rover 0 0 :n)] (expect "rover knows (x,y) and the direction (N,S,E,W) it is facing" r {:x 0 :y 0 :direction :n})) (let [r (rover 0 0 :n)] (expect "The rover receives a character array of commands" (r:command [:f :f :f]) {})) (let [r (rover 0 0 :n)] (expect "Moves north when pointing north and asked to move forward" (r:command [:f]) {:x 0 :y 1 :direction :n})) (let [r (rover 0 0 :s)] (expect "Moves south when pointing south and asked to move forward" (r:command [:f]) {:x 0 :y -1 :direction :s})) (print "OK")