Как исправить ошибку: RuntimeException Unmatched delimiter:)

Проблема в том, что если я передам эту функцию (в моем 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 при передаче этого точного числа.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
96
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

Вы не можете ввести целочисленный литерал как 08. Просто используйте 8 для числа eight. Или вы можете изменить функцию, чтобы она принимала строковый аргумент вместо целого числа. Затем вы можете ввести "8" или "08". Строка не имеет ограничений.

Alan Thompson 28.05.2019 22:55

Другие вопросы по теме