Как исправить ошибку: RuntimeException Unmatched delimiter:) - PullRequest
0 голосов
/ 28 мая 2019

Проблема в том, что если я передам эту функцию (в моем REPL) с 08 или 09, она выдаст мне ошибку.

Я попытался удалить круглые скобки, чтобы посмотреть, исчезнет ли ошибка.

(defn format-pump-number [number]
  (if (.contains (str number) "0")
    (str number)
    (str "0" number))
    (if (> number 9)
      (if (< number 100)
        (str number)
        (throw (Exception. "Dispenser number can only be 2 characters!"))))
      (str "0" number))

Я ожидаю, что [число] будет возвращено 08 или 09, когда пройдет точное число.

1 Ответ

0 голосов
/ 28 мая 2019

Компьютеры обычно интерпретируют число как 08 или 09 как восьмеричное, что является ошибкой, поскольку восьмеричные цифры идут только от 0..7.Исторически считалось, что использование начального нулевого символа 0 было разумным типом кода, поскольку символ 0 выглядит как символ O из слова Octal.Таким образом, когда компилятор видит целое число, начинающееся с 0, оно интерпретируется как «Следующие цифры должны интерпретироваться в base-8, а не в base-10».Пример:

 12  =>  twelve (parsed using base-ten)
012  =>  ten    (parsed using base-eight)

Эта попытка быть чрезмерно умной до сегодняшнего дня, как вы обнаружили, вызывает проблемы.

Итак, это вовсе не ваша функция, а просто плохое сообщение об ошибке.Обратите внимание:

(println "val=" 8) => `val= 8`

, но

(println "val=" 08)
  => Error refreshing environment: Syntax error reading source at (tst/demo/core.clj:19:20).

Я не получаю сообщение об ошибке, касающееся «Несоответствующего разделителя», поэтому я не уверен, как это возникло.

...