(* rot13: string -> string rot13(s) => rot13 encoded version of s *) fun rot13 (s:string) = let fun rot13_char (c:char) = (* rot13 a single char *) if (c >= #"A" andalso c <= #"N") orelse (c >= #"a" andalso c <= #"n") then chr(ord(c) + 13) else if (c >= #"O" andalso c <= #"Z") orelse (c >= #"o" andalso c <= #"z") then chr(ord(c) - 13) else c fun rot13_clist [] : char list = [] (* empty set *) | rot13_clist (c::cs) = rot13_char(c) :: rot13_clist(cs) in implode(rot13_clist(explode(s))) end