在clojure中定义地图时出错

时间:2017-07-05 10:28:14

标签: clojure

我是新的clojure,在运行此代码时无法理解确切的问题

(def my-map {name "Srini" empid "10000"})

收到此错误:

  

CompilerException java.lang.RuntimeException:无法在此上下文中解析符号:empid,编译:(/ Users / srini / Downloads / clojureexample / my-stugg / src / my_stugg / corecomponents.clj:95:1)

(def my-map {name "Srini" :empid "10000"})

成功运行。

我在第一行做错了什么?

(def my-map {name "Srini" empid "10000"})

2 个答案:

答案 0 :(得分:2)

Clojure正在尝试解析empid但不能,因此会返回错误。

Clojure允许您将大多数任何东西定义为关键字。这包括非常常见的关键字和字符串,还包括符号,函数,数字,矢量和其他地图等数据结构等。

您的示例包含一个有效映射,即绑定到name的函数,映射到字符串“Srini”。但是,另一个映射无效,因为empid未绑定到任何内容。

最常见的情况是为您的密钥使用关键字,这特别有利于允许通过关键字以安全(非NullPointerException - 导致)的方式访问这些值:

(:name {:name "Srini" :empid 10000})
=> "Srini"

所以,虽然可能存在你想要将某个函数映射到某个东西的情况,但这对你来说显然不是正确的方法。 (另外,作为关键字的字符串在从数据已经是字符串的文件或数据库中读取时特别有用,并且转换为关键字和从关键字转换没有任何优势。

答案 1 :(得分:0)

您可能希望将密钥更改为关键字。在Clojure中,关键字是在字符串前面用冒号写的,但是你不需要引号(只要你的关键字中没有空格,但是不要复杂)。

我建议简单地开始:

(def my-map {:name "george"})

这将创建一个包含单个键和值的地图。

如果您想使用let,请执行以下操作:

(let [my-map {:name "george"}] my-map)

更新:嗯,你似乎已经改变了你的问题了!我还是真的建议简单地开始。

name已被定义为clojure中的函数(它获取符号或关键字的字符串版本),因此您不应该使用它。如果要创建密钥,请使用:name,除非您想在let绑定中隐藏名称“name”,但这与地图中的密钥无关。

我觉得你可能需要学习地图的基础知识,然后在你疯狂地举例说明之前。坚持简单的事情,并确保你的钥匙不是符号。