(define morse-code '(
(#\A ".-") (#\B "-...") (#\C "-.-.") (#\D "-..")
(#\E ".") (#\F "..-.") (#\G "--.") (#\H "....")
(#\I "..") (#\J ".---") (#\K "-.-") (#\L ".-..")
(#\M "--") (#\N "-.") (#\O "---") (#\P ".--.")
(#\Q "--.-") (#\R ".-.") (#\S "...") (#\T "-")
(#\U "..-") (#\V "...-") (#\W ".--") (#\X "-..-")
(#\Y "-.--") (#\Z "--..") (#\1 ".----") (#\2 "..---")
(#\3 "...--") (#\4 "....-") (#\5 ".....") (#\6 "-....")
(#\7 "--...") (#\8 "---..") (#\9 "----.") (#\0 "-----")
(".-" #\A) ("-..." #\B) ("-.-." #\C) ("-.." #\D)
("." #\E) ("..-." #\F) ("--." #\G) ("...." #\H)
(".." #\I) (".---" #\J) ("-.-" #\K) (".-.." #\L)
("--" #\M) ("-." #\N) ("---" #\O) (".--." #\P)
("--.-" #\Q) (".-." #\R) ("..." #\S) ("-" #\T)
("..-" #\U) ("...-" #\V) (".--" #\W) ("-..-" #\X)
("-.--" #\Y) ("--.." #\Z) (".----" #\1) ("..---" #\2)
("...--" #\3) ("....-" #\4) ("....." #\5) ("-...." #\6)
("--..." #\7) ("---.." #\8) ("----." #\9) ("-----" #\0)
(#\space "")))
(define (morse str)
(let loop ((cs (string->list str)) (result '()))
(if (null? cs) (list->string (cdr (reverse result)))
(loop (cdr cs) (append (reverse (string->list
(cadr (assoc (char-upcase (car cs)) morse-code))))
(list #\space) result)))))
(define (un-morse str)
(let loop ((cs (string->list str)) (ms '()) (result '()))
(cond ((null? cs)
(if (null? ms)
(list->string (reverse result))
(list->string (reverse (cons (cadr (assoc
(list->string (reverse ms)) morse-code)) result)))))
((char=? (car cs) #\space)
(if (null? ms)
(loop (cdr cs) ms (cons #\space result))
(loop (cdr cs) '() (cons (cadr (assoc (list->string
(reverse ms)) morse-code)) result))))
((or (char=? (car cs) #\.) (char=? (car cs) #\-))
(loop (cdr cs) (cons (car cs) ms) result)))))
(display (un-morse (morse "Programming Praxis")))