You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 22:01:01