name関数は文字列を受け取る

タイトルの通り。

namenamespaceと対になる関数で、c.l.Namedなオブジェクトの名前空間修飾を除いた名前部分の文字列を返す。

(name 'foo/bar) ;=> "bar"

そういう理解だったのでてっきりNamedなオブジェクト、つまりシンボルとキーワードに対してしか適用できないと思っていた。 なので、これまで「シンボル、キーワードもしくは文字列を受け取って文字列に型変換する」という場合には、以下のように書いていた:

(if (string? x)
  x
  (name x))

nameが文字列も受け取れることを利用すると、実は簡潔にこう書ける:

(name x)

ちなみに、「シンボル、キーワードもしくは文字列を受け取ってキーワードに型変換する」場合には、keywordがシンボル/キーワード/文字列を受け取れることを利用して次のように書ける:

(keyword x)

Clojureでは、enum的な値が欲しくなった場合にシンボル/キーワード/文字列を使うことが多い(シンボルを使うケースは比較的少ないが)。また、往々にしてこれらの値はinterchangeableに使えることが期待されるので、これらの値の簡潔な相互変換の方法は重宝する。

updatedupdated2016-05-172016-05-17