При выводе номера:
б uilt в format
функции делает это красиво:
user> (format "%o" 19)
"23"
, конечно, ничего о ряде знает, если это было первоначально предусмотрено в определенном формате, хотя, если вы поместите его в коллекцию и хранить эту информацию вместе с ним, либо непосредственно или в метаданных вы можете отслеживать это.
Что касается цифр чтения обеспокоен:
числа Clojure в восьмеричном по умолчанию, если они начинаются с ведущим нулем
Просто обычным предупреждением, что clojure.core/чтение строка ПОЛНОСТЬЮ UNSAFE в использовать на ненадежном входе. Он будет запускать код из строки во время чтения, если не будет тщательно управляться.
пользователь clojure.edn/чтения строки вместо
Они оба будут читать восьмеричное число для вас просто отлично:
user> (clojure.edn/read-string "023")
19
user> (read-string "023")
19
И clojure.edn/чтения строки откажет p0wn сервер:
user> (read-string "#=(println \"Pwning your server now\")")
Pwning your server now
nil
user> (clojure.edn/read-string "#=(println \"Pwning your server now\")")
RuntimeException No dispatch macro for: = clojure.lang.Util.runtimeException (Util.java:221)
Так что стоит быть в привычке использовать clojure.edn для всех данных, которые он фактически не является часть вашего PROGRA м.
PS: есть динамический var, который вы можете установить, чтобы отключить функцию чтения-eval строки чтения, и в зависимости от нее произойдет авария.
Значит, 'a' должен иметь целочисленный тип? Исходное представление целого не является частью его представления времени выполнения, поэтому нет смысла проверять «если число начинается с« 0 »». –
Я понимаю, однако, что я пишу это, чтобы понять, как создать обработку ошибок для восьмеричных чисел, когда предполагаемый номер базы 8. Например, я хотел бы иметь возможность изменять 023 до 23, но не 23 до 27. – CS456
Когда я говорю «это не имеет смысла», я имею в виду, что необходимая информация для ответа на вопрос, который вы задаете, отсутствует во время выполнения, поэтому то, что вы просите, невозможно.Во время выполнения '023' представляется точно так же, как' (Integer/parseInt "10011" 2) ', а' 23' представляется точно так же, как '(Integer/parseInt" 10111 "2)'. Вы не можете вернуть представление, которое использовалось в исходном коде. –