Building Weather Symphonies with Parser Combinators
A METAR report like CYYZ 101800Z 25015G25KT 10SM FEW080 M05/M12 A2992 isn’t just weather data—it’s a carefully structured language where each component has meaning. Similarly, a jazz chord progression builds complexity from simple intervals. Both rely on the elegant principle of parser combinators: building sophisticated parsers from small, reusable components.
(define (parse-visibility input)
(cond
((string-prefix? "10SM" input) '(visibility . clear))
((string-prefix? "5SM" input) '(visibility . hazy))
(else '(visibility . unknown))))
(define (parse-temp input)
(if (string-prefix? "M" input)
(cons 'temp (- (string->number (substring input 1))))
(cons 'temp (string->number input))))
(define (combine-weather . parsers)
(lambda (input) (map (lambda (p) (p input)) parsers)))
Scheme’s natural recursion makes parser combinators feel like musical composition—each function a note, each combination a chord. The combine-weather combinator orchestrates multiple parsers, just as a chord combines multiple pitches.
Java’s object-oriented approach offers different harmonies:
import java.util.*;
import java.util.function.Function;
import static java.util.stream.Collectors.toList;
class MetarParser {
static Function<String, Optional<String>> visibility = input ->
input.startsWith("10SM") ? Optional.of("clear") : Optional.empty();
static Function<String, Optional<Integer>> temperature = input -> {
if (input.startsWith("M")) return Optional.of(-Integer.parseInt(input.substring(1)));
return Optional.of(Integer.parseInt(input));
};
static <T> Function<String, List<T>> combine(Function<String, Optional<T>>... parsers) {
return input -> Arrays.stream(parsers)
.map(p -> p.apply(input))
.filter(Optional::isPresent)
.map(Optional::get)
.collect(toList());
}
}
Where Scheme flows like improvised jazz, Java structures like a written score. Both capture the essential insight: complex parsing emerges from simple, composable rules. A weather briefing becomes a symphony of small, predictable patterns—wind direction combining with visibility, temperature harmonizing with pressure readings, each parser a musician in the ensemble of understanding.