请在2024 Clojure状态调查!中分享您的想法。

欢迎!请参阅关于页面以获取更多相关信息。

0
语法和读取器

我正在通过罗马数字的 Clojure 练习。
我有
(def roman-numerals {"M" 1000 "D" 500 "C" 100 "L" 50 "X" 10 "V" 5 "I" 1})
我希望将"XVI"等转换为数字,作为一个开始。但是

(map #(println %) (sequence "XIV"))
打印
`X
(nilI
nilV
nil)`

并且

(map #(get roman-numerals %) (sequence "XIV"))
生成
(nil nil nil)

我该如何使映射使用序列中的实际字符呢?

(sequence "XIV") => (\X \I \V)

2 答案

0

编辑
 
最佳答案

尝试

(def roman-numerals {\M 1000 \D 500 \C 100 \L 50 \X 10 \V 5 \I 1})
(map roman-numerals "XVI")
;;=> (10 5 1)

如果您想在映射中保留字符串

(map #(roman-numerals (str %)) (sequence "XIV"))
对我而言,Clojure中字符不是字符串,因此我需要使用字符键而不是字符串键。
0

可以使用str将字符转换为字符串(任何东西都可以),因此一种方法是操作字符串作为字符序列,映射为字符串,然后像以前一样在映射中查找。另一种选择是使用前面提到的字符作为键。

(def roman-numerals
 {"M" 1000 "D" 500 "C" 100 "L" 50 "X" 10 "V" 5 "I" 1})
(defn unroman [numeral]
   (->> numeral
       (map (comp roman-numerals str))
       (reduce +)))

user> (unroman "XIV")
16
...