Wie konvertiere ich ein Clojure-Schlüsselwort in eine Zeichenfolge?

100

In meiner Anwendung muss ich das Schlüsselwort clojure konvertieren, z. : var_name in eine Zeichenfolge "var_name". Irgendwelche Ideen, wie das gemacht werden könnte?

Santosh
quelle

Antworten:

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
quelle
3
Ich kann mir keine vollständigere Antwort vorstellen, aber nur zum Spaß werde ich es wagen, dass jemand darauf kommt.
Hamish Grubijan
2
@ Hamish Vielleicht durch Hinzufügen (source name)?
Ponzao
2
Wie namefunktioniert sollte nicht von Interesse sein. Der Docstring ist der Vertrag. Alles andere ist ein Implementierungsdetail, auf das man sich nicht verlassen sollte.
Kotarak
3
Danke Kotarak! Ich liebe diese Clojure jeden Tag mehr! Dies ist mein dritter Tag.
Santosh
4
Vielleicht sollte diese Antwort erklären, warum (name :foo/123/bar)"bar" ist. Wenn Sie den vollständigen Pfad eines Schlüsselworts möchten, das Sie verwenden müssen, subsoder so ähnlich(str (namespace k) "/" (name k))
AnnanFay
13

Tatsächlich ist es genauso einfach, den Namespace-Teil eines Schlüsselworts abzurufen:

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

Beachten Sie, dass Namespaces mit mehreren Segmenten durch ein '.' Und nicht durch ein '/' getrennt werden.

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

Dies funktioniert auch mit Namespace-qualifizierten Schlüsselwörtern:

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

Beachten Sie, dass die Antwort von kotarak nicht den Namespace-Teil des Schlüsselworts zurückgibt, sondern nur den Namensteil - also:

(name :foo/bar)
>"bar"

Wenn Sie seinen anderen Kommentar verwenden, erhalten Sie das, wonach Sie gefragt haben:

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

Es ist keine mühsame Aufgabe, einen Datentyp in eine Zeichenfolge zu konvertieren. Hier ein Beispiel mit 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
quelle
-2

Dadurch erhalten Sie auch eine Zeichenfolge aus einem Schlüsselwort:

(str (name :baz)) -> "baz"
(str (name ::baz)) -> "baz"
matt was auch immer
quelle
2
strwird in Ihrem Beispiel nicht benötigt.
Vincent Cantin