Есть ли в clojure необработанная строка?

В Python я могу добавить префикс r к строковому литералу (необработанной строке), чтобы интерпретатор не переводил специальные символы в строку:

>>> r"abc\nsdf#$%\^"
r"abc\nsdf#$%\^"

Есть ли способ сделать то же самое в Clojure?


person John Wang    schedule 15.06.2012    source источник


Ответы (3)


Строки Clojure — это строки Java, и читатель не добавляет ничего существенного к их интерпретации. На на странице для чтения просто написано "поддерживаются стандартные escape-символы Java".

Однако вы можете избежать \:

user> (print "abc\\nsdf#$%\\^")
abc\nsdf#$%\^

Это влияет только на строковые литералы, читаемые программой чтения, поэтому, если вы читаете строки из файла, программа чтения никогда их не увидит:

user> (spit "/tmp/foo" "abc\\nsdf#$%\\^")
nil
user> (slurp "/tmp/foo")
"abc\\nsdf#$%\\^"
user> (print (slurp "/tmp/foo"))
abc\nsdf#$%\^nil
user> 

Итак, я думаю, что основной ответ - нет.

person Arthur Ulfeldt    schedule 15.06.2012

Также обратите внимание, что если вы используете против часовой стрелки (плагин Eclipse для Clojure), существует режим, называемый «умная вставка» (отключен по умолчанию), который заботится о правильном экранировании специальных символов при вставке в существующую литеральную строку.

person Laurent Petit    schedule 15.06.2012

Для таких целей может пригодиться буквальное регулярное выражение.

user=> #"abc\nsdf#$%\^"
#"abc\nsdf#$%\^"
user=> (type #"abc\nsdf#$%\^")
java.util.regex.Pattern
user=> (println (str #"abc\nsdf#$%\^"))
abc\nsdf#$%\^
nil
person BLUEPIXY    schedule 15.06.2012