基于Clojure的字符串转摩斯码转换器开发问题求助
问题分析与修复方案
原代码的核心问题
- 函数定义语法错误:
defn缺少开头括号,导致函数无法正确定义 - 映射表键类型不匹配:使用关键字(
:A)作为键,但输入处理后得到的是字符(\A),无法匹配 - 迭代逻辑倒置:遍历映射表而非输入字符,无法逐个处理输入内容
- 条件判断语法与逻辑错误:
if语句括号不闭合,且判断逻辑完全错误 - 全局变量滥用:函数内部用
def定义映射表,违反函数式编程无副作用原则 - 输入处理错误:
str/upper-case(seq x)语法错误,无法正确将输入字符串转为大写字符序列 - 输出逻辑混乱:零散打印且最后重复输出原始输入,未生成完整的摩斯码结果
修正后的代码
(ns clojureassignment.core (:gen-class)) (require '[clojure.string :as str]) ; 定义摩斯码映射表,键为大写字符,匹配输入处理后的类型 (def ascii->morse-map {\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 "--..", \0 "-----", \1 ".----", \2 "..---", \3 "...--", \4 "....-", \5 ".....", \6 "-....", \7 "--...", \8 "---..", \9 "----."}) ; 实现ASCII到摩斯码的转换函数 (defn ascii->morse [input-str] ; 将输入字符串转为大写字符序列,逐个处理 (let [upper-chars (seq (str/upper-case input-str))] ; 遍历每个字符,查找对应摩斯码,无法识别的字符用"?"标记 (->> upper-chars (map #(get ascii->morse-map % "?")) ; 将所有摩斯码用空格分隔,组成完整结果字符串 (str/join " ")))) (defn -main [& args] (println "ASCII to Morse Converter.") (println "Enter your string:") ; 用let定义局部变量,避免全局副作用 (let [string-input (read-line)] (println "Original input:" string-input) (println "Morse code result:" (ascii->morse string-input)))) (-main)
关键修改说明
- 映射表适配:将键改为大写字符(
\A),与输入处理后的字符类型完全匹配,确保能正确查找对应摩斯码 - 纯函数式转换:使用
map+get组合完成转换,避免doseq的副作用打印,而是收集结果后统一输出,符合函数式编程规则 - 输入处理修正:先将整个字符串转大写,再拆分为字符序列,确保每个字符都是可匹配的格式
- 变量作用域规范:映射表定义为全局常量(适合复用),函数内部用
let管理局部变量,避免全局变量污染 - 输出逻辑优化:将转换后的摩斯码用空格连接成完整字符串,输出结果更清晰易读
- 错误处理完善:用
get的默认值"?"标记无法识别的字符,替代原有的零散错误打印
内容的提问来源于stack exchange,提问作者Ebel Ofori
相关产品推荐
相关产品推荐

