2017-01-05 1 views
0

Я пытаюсь создать функцию обработки восьмеричной в Clojure, до сих пор у меня есть это:восьмиштырьковый номер обработки в Clojure

(defn octal [a] 
    (if (= 023 a) 
     (Integer/toOctalString a) 
     a)) 

, где у меня есть «023» я хотел бы заменить его с некоторой логики, проверяет, начинается ли число с «0». Я знаю, с чего начать? для строк, есть ли метод для использования с числами?

Я пытаюсь сделать это таким образом, как если бы я передал Integer/toOctalString целое число без 0, оно возвращает большее число. Например. 2345 становится 4451.

Спасибо

+1

Значит, 'a' должен иметь целочисленный тип? Исходное представление целого не является частью его представления времени выполнения, поэтому нет смысла проверять «если число начинается с« 0 »». –

+0

Я понимаю, однако, что я пишу это, чтобы понять, как создать обработку ошибок для восьмеричных чисел, когда предполагаемый номер базы 8. Например, я хотел бы иметь возможность изменять 023 до 23, но не 23 до 27. – CS456

+1

Когда я говорю «это не имеет смысла», я имею в виду, что необходимая информация для ответа на вопрос, который вы задаете, отсутствует во время выполнения, поэтому то, что вы просите, невозможно.Во время выполнения '023' представляется точно так же, как' (Integer/parseInt "10011" 2) ', а' 23' представляется точно так же, как '(Integer/parseInt" 10111 "2)'. Вы не можете вернуть представление, которое использовалось в исходном коде. –

ответ

1

кажется read-string может сделать это для вас:

(read-string "023") 
; ==> 19 

(read-string "19") 
; ==> 19 

Если вы хотите прочитать восьмеричный без префикса вы можете просто добавить ноль перед передачей его:

(defn octal->integer [s] 
    (read-string (str \0 s))) 

(octal->integer "23") 
; ==> 19 
0

При выводе номера:

б 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 строки чтения, и в зависимости от нее произойдет авария.

Смежные вопросы