Clojure:很容易从无效字符串转换为有效关键字

时间:2014-01-23 16:00:06

标签: clojure

我一直试图找到一种惯用的方法,将用户数据转换为clojure中的有效关键字。

一个可能的用例就是在excel电子表格中读取时,我想为第一行包含将成为关键字的标题之外的每一行动态构建一个映射。我需要考虑可能包含空格或其他无效字符的标题。我已经读过关键字函数不会抱怨并会给你一个无效的密钥,可能很难处理,甚至有害。

我可以手动进行转换或者可能使用像slugger这样的框架来做这件事,但我想知道是否有任何已经内置的东西可以处理这个问题。

此外,我已经读过,在某一点上创建太多密钥会使堆重载,但那是从2010年开始,它可能已在1.3中解决。我最好用字符串键而不是关键字创建哈希映射吗?我已经读到这样做并不是惯用的。

2 个答案:

答案 0 :(得分:1)

除非你有充分的理由不这样做,否则只需使用字符串本身作为密钥。

user=> (def my-db (atom {}))
#'user/my-db
user=> (swap! my-db assoc "New York" 1)
{"New York" 1}
user=> (swap! my-db assoc "Los Angeles" 2)
{"Los Angeles" 2, "New York" 1}
user=> (do (print "Which city do you want to rank?\n =>") 
           (flush) 
           (@my-db (read-line)))
Which city do you want to rank?
 =>New York
1

如果您对地图进行编码/关键字化,则必须在每次与用户惯例的互动中进行编码/关键字化或字符串化/解码。

答案 1 :(得分:0)

嗯,keyword似乎会吐出不可读的关键字:

user=> (keyword "foo bar")
:foo bar
user=> (keyword "foo:")
:foo:

这些都不能再次读入。

我会写一个小函数来清理输入(规则here),然后再将它传递给keyword函数。