7 Stroke Geometry
racket/draw’s pen% has no concept of a dash pattern at all, so drawing a dashed stroke means computing the dashed sub-segments directly: flatten a dc-path%’s curves into a polyline, then split that polyline into the "on" runs a dash pattern would draw. dc-path->polylines and dash-split-polyline are the two pieces of that pipeline, exported separately in case you want polyline flattening or dash-splitting without the other.
parse-linecap, parse-linejoin, and parse-clip-rule are small, self-contained parsers converting SVG’s own attribute-value keywords into the symbols racket/draw expects.
procedure
(parse-dasharray s)
→ (or/c (listof (and/c real? (not/c negative?))) #f) s : (or/c string? #f)
> (parse-dasharray "5,10") '(5 10)
> (parse-dasharray "5 10 15") '(5 10 15 5 10 15)
> (parse-dasharray "none") #f
> (parse-dasharray "-1,2") #f
A solid line, and the same line dashed via (parse-dasharray "18,10") fed to dash-split-polyline below:

procedure
(parse-linecap s) → (or/c 'round 'projecting 'butt)
s : string?
Butt, round, and square caps on three identical, otherwise-unstyled segments (the thin line below each shows where the segment’s true endpoints are):

procedure
(parse-linejoin s) → (or/c 'round 'bevel 'miter)
s : string?
Miter, round, and bevel joins on the same corner:

procedure
(parse-clip-rule s) → (or/c 'odd-even 'winding)
s : (or/c string? #f)
Two overlapping circles, filled as one path, under 'winding (left: both circles fully filled, since the overlap is still covered at least once in the same winding direction) versus 'odd-even (right: the overlap is left unfilled, since it’s covered an even number of times):

procedure
(dc-path->polylines p [curve-samples])
→ (listof (listof (cons/c real? real?))) p : (is-a?/c dc-path%) curve-samples : exact-positive-integer? = 16
A closed subpath’s polyline always ends by repeating its own first point (closing the loop explicitly), even if the underlying path segments didn’t already return to their exact starting coordinates.
> (dc-path->polylines (car (path-data->dc-paths "M0,0 L50,0 L25,50 Z"))) '(((0.0 . 0.0) (50.0 . 0.0) (25.0 . 50.0) (0.0 . 0.0)))
A curve (light gray) with its flattened sample points overlaid as dots:

procedure
(dash-split-polyline pts pattern offset)
→ (listof (listof (cons/c real? real?))) pts : (listof (cons/c real? real?)) pattern : (listof (and/c real? (not/c negative?))) offset : real?
> (dash-split-polyline '((0 . 0) (100 . 0)) '(10 5) 0)
'(((0 . 0) (10.0 . 0))
((15.0 . 0) (25.0 . 0))
((30.0 . 0) (40.0 . 0))
((45.0 . 0) (55.00000000000001 . 0))
((60.0 . 0) (70.0 . 0))
((75.0 . 0) (85.0 . 0))
((90.0 . 0) (100.0 . 0)))
See parse-dasharray above for this function’s own visual example —