SkyJack is a DSL that was created by Alexander Chang-Davidson and myself for Michael Ballantyne's "Hack Your Own Language" special topics class. It seeks to solve the problem of planning flight routes being a tedious process of information gathering and logging. SkyJack allows a pilot to simply type in airports and VORs to navigate through and then with ease, generate a report of their journey. SkyJack does NOT solve the actual generation of the route, just everything after.
SkyJack leverages Racket's powerful macro system to provide compile time feedback for valid data (for example if the radio frequency provided for ATC is actually in the radio band it should be) and route viability (for example making sure you don't have two airports across the globe from each other in sequence). Since this is done at compile time, this only needs to be checked once when compiling a route, then that route can be used in the report generators well within the knowledge that it is valid and well formed.
The second part of SkyJack is the report generator DSL. This allows pilots to easily define what information they want collected from the plan and then extract that information from any plan. This could be used to collect GPS coordinates of VORs, frequencies for ATC, or even just names of airports or VORs you will be flying through. The report generator features an easy to use and intuitive syntax which allows even the most inexperienced programmers to understand what is going on.
SkyJack was praised for being a practical solution to a practical problem, as well as being the only report generator DSL made in the 21st centruy ;-).
The following is an example of SkyJack planning a route from KBOS to KJFK with a report printing the names of each VOR and airport:
(define-airport KBOS
[size large]
[country US]
[radio
("D-ATIS" 135.0)
("Tower East" 132.225)
("Tower West" 128.8)
("Ground" 121.75)
("Clearance" 121.65)
("Ramp" 134.05)]
[coordinates 42.36197 -71.0079]
[elevation 20])
(define-airport KJFK
[country US]
[size large]
[radio
("D-ATIS" 115.1)
("Tower" 119.1)
("Tower Alt" 123.9)
("Ground" 121.9)
("Clearance" 135.05)]
[coordinates 40.639447 -73.779317]
[elevation 13])
(define-vor PVD
[country US]
[frequency 115.6]
[power high]
[elevation 49]
[coordinates 41.7243003845215 -71.4296035766602])
(define-vor ORW
[country US]
[frequency 110.0]
[power high]
[elevation 310]
[coordinates 41.5564002990723 -71.999397277832])
(define-vor CCC
[country US]
[frequency 117.2]
[power medium]
[elevation 86]
[coordinates 40.9295997619629 -72.7988967895508])
(define-plan boston-to-new-york-city
KBOS
D-> PVD
D-> ORW
D-> CCC
D-> KJFK)
(define generate-report
(make-text-report-generator
[airport name]
[vor name]))
(generate-report boston-to-new-york-city)
SkyJack can be found on
Github. It can be installed
using Racket's raco pkg package manager.