这是另一种做我认为你想做的事的方法。不要将变量的类别定义为其值,请使用Clojure映射。例如使用基本{}
地图语法:
(def what-is-map {"dog" "animal"
"cat" "animal"
"Fiat" "auto"
"flu" "illness"})
(defn what-is [thing]
(str thing " is an " (what-is-map thing)))
最后一个表达式工作,因为地图可以像在许多情况下函数中使用。
(what-is "dog") ;=> "dog is an animal"
(what-is "flu") ;=> "flu is an illness"
您还可以为地图中未包含的东西提供默认值。这里有一种方法:
(defn what-is [thing]
(let [what-it-is (what-is-map thing)]
(if what-it-is
(str thing " is a " what-it-is)
(str "I don't know what a " thing " is"))))
的if
作品,因为当钥匙未在地图中找不到,则返回nil
。 (nil
是假的价值观之一。另一种是false
。)
(what-is "fish") ;=> I don't know what a fish is"
还有其他的,也许是更好的方法来写这些功能,但我想保持基本的东西。
谢谢@Sam Estep。这就是我要找的。 – omar
为什么一个引用的运算符像'('name 5); ==> nil'在Clojure中工作? – Sylwester
@Sylwester是;请参阅我对[此问题]的回答(http://stackoverflow.com/q/35541931/5044950)。 'Symbol'类提供['invoke']的实现(https://github.com/clojure/clojure/blob/clojure-1.8.0/src/jvm/clojure/lang/Symbol.java#L125-L127 )相当于['get'](https://clojuredocs.org/clojure.core/get)。 –