Clojureで変数名とかに使える文字は実際なところ何なのか


とるに足らぬコネタを。

Clojure – reader

や書籍「プログラミングClojure」の24ページを読むと、英数字および

  • +
  • _
  • *
  • /
  • !
  • ?
  • .

が、シンボルとして今後も使える文字だということが書かれている。また、/と.は名前空間用に特別扱いされるとのこと。

そのおかげで「nil?」みたいな関数名が実現できるわけだ。

が、世の中のClojureのプログラムを見渡すともっといろいろな記号が使われている。

ClojureからJavaScriptのオブジェクトに変換できる「clj->js」というメソッド名では、>が使われている。

こんな風にClojure公式なメソッドとしても上記以外の記号が使われているところをみると、もっと多くありそうだということになる。

Clojureのjvm/clojure/lang/Compiler.javaには下記のように書かれていて、いろいろな記号は置き換えられて処理されているようだ(このあたり詳しい人つっこみください)

static final public IPersistentMap CHAR_MAP =
        PersistentHashMap.create('-', "_",
//                               '.', "_DOT_",
':', "_COLON_",
'+', "_PLUS_",
'>', "_GT_",
'<', "_LT_",
'=', "_EQ_",
'~', "_TILDE_",
'!', "_BANG_",
'@', "_CIRCA_",
'#', "_SHARP_",
'\'', "_SINGLEQUOTE_",
'"', "_DOUBLEQUOTE_",
'%', "_PERCENT_",
'^', "_CARET_",
'&', "_AMPERSAND_",
'*', "_STAR_",
'|', "_BAR_",
'{', "_LBRACE_",
'}', "_RBRACE_",
'[', "_LBRACK_",
']', "_RBRACK_",
'/', "_SLASH_",
'\', "_BSLASH_",
'
?', "_QMARK_");

ただし、上記の記号すべてを使えるわけじゃなくて、REPLで試してみたところ「{」「}」「[」「]」「\」「”」「~」「^」は使えなかった。

また、先頭にあるとNGなケースもある。

まあ、将来的に使えなくなる可能性もあるので、積極的利用は避けたほうがいいのかもしれないが、例えばこんな書き方をしているケースを見かけたことがある

(def a:List<String> ["A" "B"])

実際、評価ができる

=> a:List<String>
["A" "B"]

こんな名前のつけ方ができる言語はあまりなさそうだ。

Comments are closed.