Comment convertir un mot clé clojure en une chaîne?

100

Dans mon application, j'ai besoin de convertir le mot-clé clojure par exemple. : nom_var dans une chaîne "nom_var". Des idées comment cela pourrait être fait?

Santosh
la source

Réponses:

166
user=> (doc name)
-------------------------
clojure.core/name
([x])
  Returns the name String of a string, symbol or keyword.
nil
user=> (name :var_name)
"var_name"
kotarak
la source
3
Je ne peux pas imaginer une réponse plus complète, mais juste pour le plaisir, je vais défier quelqu'un de la trouver.
Hamish Grubijan
2
@Hamish Peut-être en ajoutant (source name)?
ponzao
2
Comment namefonctionne ne devrait pas être d'intérêt. Le docstring est le contrat. Tout le reste est un détail de mise en œuvre sur lequel il ne faut pas se fier.
kotarak
3
Merci kotarak! J'adore ce Clojure chaque jour plus! C'est mon troisième jour.
Santosh
4
Peut-être que cette réponse devrait expliquer pourquoi (name :foo/123/bar)«bar». Si vous voulez le chemin complet d'un mot-clé que vous devez utiliser subsou quelque chose comme(str (namespace k) "/" (name k))
AnnanFay
13

En fait, il est tout aussi facile d'obtenir la partie espace de noms d'un mot-clé:

(name :foo/bar)  => "bar"
(namespace :foo/bar) => "foo"

Notez que les espaces de noms avec plusieurs segments sont séparés par un «.», Pas un «/»

(namespace :foo/bar/baz) => throws exception: Invalid token: :foo/bar/baz
(namespace :foo.bar/baz) => "foo.bar"

Et cela fonctionne également avec les mots-clés qualifiés d'espace de noms:

;; assuming in the namespace foo.bar
(namespace ::baz) => "foo.bar"  
(name ::baz) => "baz"
txmikester
la source
12

Notez que la réponse de kotarak ne retournera pas la partie espace de nom du mot-clé, juste la partie nom - donc:

(name :foo/bar)
>"bar"

L'utilisation de son autre commentaire donne ce que vous avez demandé:

(subs (str :foo/bar) 1)
>"foo/bar"
Rafael Munitić
la source
0

Ce n'est pas une tâche fastidieuse de convertir un type de données en une chaîne, voici un exemple en utilisant str .

(defn ConvertVectorToString []
 (let [vector [1 2 3 4]]
 (def toString (str vector)))
  (println toString)
  (println (type toString)
(let [KeyWordExample (keyword 10)]
 (def ConvertKeywordToString (str KeyWordExample)))
  (println ConvertKeywordToString)
  (println (type ConvertKeywordToString))

(ConvertVectorToString) ;;Calling ConvertVectorToString Function

Output will be:
1234
java.lang.string
10
java.lang.string
Satyam Ramawat
la source
-2

Cela vous donnera également une chaîne d'un mot-clé:

(str (name :baz)) -> "baz"
(str (name ::baz)) -> "baz"
mat quoi que ce soit
la source
2
strn'est pas nécessaire dans votre exemple.
Vincent Cantin