(define bubble-sort X -> (bubble-again-perhaps (bubble X) X)) (define bubble [ ] -> [ ] [X] -> [X] [X Y | Z] -> [Y | (bubble [X | Z])] where (prior? Y X) [X Y | Z] -> [X | (bubble [Y | Z])]) (define bubble-again-perhaps X X -> X X _ -> (bubble-sort X)) (define prior? Name1 Name2 -> (string< (surname Name1) (surname Name2))) (define surname Name -> (surname-help Name "")) (define surname-help "" Surname -> Surname (@s S Name) _ -> (surname-help Name "") where (whitespace? S) (@s S Name) Surname -> (surname-help Name (cn Surname S))) (define whitespace? S -> (let N (string->n S) (element? N [9 10 13 32]))) (define string< (@s S _) (@s S# _) -> true where (< (string->n S) (string->n S#)) (@s S Ss) (@s S Ss#) -> (string< Ss Ss#) "" (@s _ _) -> true _ _ -> false) (bubble-sort ["Rudolf Carnap" "Richard Dawkins" "John Backus" "Harold Abelson" ])