Сегодня я буду экспериментировать с выражениями в разных REPL. Если я столкнусь с неожиданным результатом, я попытаюсь объяснить или выдвинуть гипотезу, почему произошел неожиданный результат.

Java REPL

Попробуйте ввести в REPL только true или false.

  • Прогноз: true вернет true, false вернет false
  • Вывод: никаких неожиданных результатов

Попробуйте ввести одно целое число, чтобы посмотреть, что вы получите в ответ.

  • Прогноз: будет возвращено целое число
  • Вывод: никаких неожиданных результатов

Попробуйте ввести одно двойное число, чтобы увидеть, что вы получите в ответ.

  • Прогноз: двойник вернется
  • Вывод: никаких неожиданных результатов

Попробуйте выполнить некоторые базовые арифметические операции над двойными числами в REPL:

Что произойдет, если разделить двойные числа?

  • Прогноз: вернется дубль
  • Вывод: никаких неожиданных результатов

Что произойдет, если вы разделите целое число на другое целое число? Например, 10 / 5.

  • Прогноз: будет возвращено целое число «2».
  • Вывод: никаких неожиданных результатов

Что произойдет, если целые числа не делятся без остатка? Например, 11 / 5.

  • Прогноз: будет возвращено целое число (без остатка)
  • Вывод: никаких неожиданных результатов

Попробуйте добавить что-нибудь к максимальному целочисленному значению. Например, 2147483647 + 12. Что происходит? Почему?

  • Прогноз: будет возвращено неверное целочисленное значение
  • Вывод: возвращено неверное целочисленное значение (-2147483637)
  • Объяснение: В Java int — это 32-битное значение, что означает, что возможное максимальное значение для int равно 2 147 483 647. Когда вы увеличиваете целое число сверх его максимального значения, происходит переполнение, и результат будет обернут до минимального значения.

Добавьте несколько двойников вместе.

  • Прогноз: вернется дубль
  • Вывод: никаких неожиданных результатов

Добавьте набор отрицательных и положительных чисел.

  • Прогноз: будет возвращено целое число (я использую целые числа)
  • Вывод: никаких неожиданных результатов

Попробуйте добавить целые и двойные числа.

  • Прогноз: Java неявно выполнит расширяющее преобразование, так что целое число будет преобразовано в двойное. Следовательно, выражение вернет двойное значение.
  • Вывод: никаких неожиданных результатов

Что произойдет, если вы попытаетесь добавить true и/или false? Почему?

  • Прогноз: выражение вернет сообщение об ошибке, поскольку Java не позволяет добавлять логические значения.
  • Вывод: никаких неожиданных результатов

Вычесть ряд отрицательных и положительных чисел.

  • Прогноз: будет возвращено целочисленное значение (с использованием целых чисел)
  • Вывод: возвращено сообщение об ошибке. Это произошло потому, что я забыл поставить пробел между оператором минус и знаком минус в выражении (2–2+2). Как только я включил пробел, ошибка исчезла.

Попробуйте совместить операции сложения и вычитания. Например, 5 + 3–2 и 5–3 + 2. Результаты соответствуют вашим ожиданиям?

  • Прогноз: оба выражения будут иметь одинаковое значение.
  • Вывод: никаких неожиданных результатов

Умножение набора отрицательных и положительных чисел.

  • Прогноз: выражение будет оцениваться как правильный ответ
  • Вывод: никаких неожиданных результатов

Попробуйте объединить несколько операций вместе. Например, 5 + 3–2 * 6 и 5–3 * 2 + 6. Результаты соответствуют вашим ожиданиям?

  • Прогноз: выражения дадут правильный ответ
  • Вывод: никаких неожиданных результатов

Разделите набор отрицательных и положительных чисел.

  • Прогноз: выражения дадут правильный ответ
  • Вывод: никаких неожиданных результатов

Попробуйте объединить несколько операций вместе. Например, 5 / 3–2 * 6 + 8 и 5–3 * 2 + 6 / 8. Результаты соответствуют вашим ожиданиям?

  • Прогноз: выражения НЕ будут оцениваться как правильный ответ, потому что есть остатки, которые не будут включены при вычислении окончательного ответа.
  • Вывод: никаких неожиданных результатов

Попробуйте разделить целое число на 0.

  • Прогноз: будет выброшено исключение
  • Вывод: никаких неожиданных результатов

Попробуйте разделить двойное число на 0. Получились такие результаты, как вы ожидали?

  • Прогноз: будет выброшено исключение
  • Вывод: вместо этого было возвращено «Бесконечность». Я не был уверен, почему это произошло, поэтому я погуглил. Оказывается, в отличие от целых чисел, числа с плавающей запятой/двойные числа имеют специальные значения для деления на ноль, одно из которых — бесконечность.

Попробуйте ввести строку в REPL.

  • Прогноз: будет возвращена строка
  • Вывод: никаких неожиданных результатов

Попробуйте ввести строку без кавычек. Что происходит?

  • Прогноз: сообщение об ошибке
  • Вывод: никаких неожиданных результатов

Попробуйте ввести строку только с одной кавычкой. Что произойдет, если это перед строкой? Что произойдет, если после?

  • Прогноз: сообщения об ошибках
  • Вывод: никаких неожиданных результатов. Когда перед строкой добавлялась одинарная кавычка, появлялось следующее сообщение об ошибке «достигнут конец файла при синтаксическом анализе». Когда после строки добавлялась одинарная кавычка, появлялось следующее сообщение об ошибке: «незакрытый строковый литерал».

Попробуйте ввести строку, заключенную в одинарные кавычки.

  • Прогноз: сообщение об ошибке
  • Вывод: никаких неожиданных результатов. Появились следующие сообщения об ошибках: «незакрытый символьный литерал» и «достигнут конец файла при разборе».

Попробуйте выполнить некоторые основные арифметические операции над целыми числами в REPL.

  • Прогноз: выражения дадут правильный ответ
  • Вывод: никаких неожиданных результатов.

Поэкспериментируйте с выражениями, которые объединяют разные типы данных.

  • Прогноз: думаю компилятору это не понравится и он выдаст ошибку
  • Вывод: никаких неожиданных результатов.

Поэкспериментируйте с выражениями, которые используют скобки (или не используют их).

  • Прогноз: выражения будут оцениваться как правильный ответ с использованием правил PEMDAS.
  • Вывод: никаких неожиданных результатов

JavaScript REPL

Попробуйте ввести в REPL только true или false.

  • Прогноз: выражение будет оценено как истинное
  • Вывод: никаких неожиданных результатов

Попробуйте ввести отдельные целые числа и числа с плавающей запятой, чтобы увидеть, что вы получите в ответ.

  • Прогноз: будут возвращены одни и те же одиночные целые числа и числа с плавающей запятой.
  • Вывод: кое-что интересное произошло, когда я набрал числа с плавающей запятой, такие как 2.0 и 9.0. Номера 2 и 9 были возвращены. Похоже, что происходит неявное сужающее преобразование (с плавающей запятой → целое число). Однако точность не теряется, поскольку при вводе чисел с плавающей запятой, таких как 3,3 и 9,7, возвращаются те же самые числа. Когда я погуглил, на веб-сайте Mozilla указано, что для целых чисел нет определенного типа.

Сложите несколько чисел вместе.

  • Прогноз: выражения будут оцениваться как правильный ответ.
  • Вывод: никаких неожиданных результатов

Добавьте набор отрицательных и положительных чисел.

  • Прогноз: выражения будут оцениваться как правильный ответ.
  • Вывод: никаких неожиданных результатов

Попробуйте добавить различные типы примитивных значений. Какие результаты вы получаете? Были ли они такими, как вы ожидали?

  • Прогноз: выражения будут оцениваться как правильный ответ (хотя ответ будет округлен до наименьшей точности без потери точности).
  • Вывод: никаких неожиданных результатов. Я погуглил, что вам нужно использовать, если вам нужно сохранить точность (заставить число быть с плавающей запятой), и ответ, который я нашел, был BigDecimal.

Попробуйте сложить логические значения вместе. Что случается? Как это соотносится с Java?

  • Прогноз: выражения будут оценены как число, в зависимости от того, какие логические значения были введены (true = 1, false = 0). Это отличается от Java, потому что в Java логические значения не оцениваются как целые числа.
  • Вывод: никаких неожиданных результатов

Попробуйте использовать логические значения с другими арифметическими операторами.

  • Прогноз: выражения будут оцениваться как число, в зависимости от того, какие логические значения были введены (true = 1, false = 0)
  • Вывод: никаких неожиданных результатов

Вычесть ряд отрицательных и положительных чисел.

  • Прогноз: выражения дадут правильный ответ
  • Вывод: никаких неожиданных результатов

Попробуйте совместить операции сложения и вычитания. Например, 5 + 3–2 и 5–3 + 2. Результаты соответствуют вашим ожиданиям?

  • Прогноз: выражения дадут правильный ответ
  • Вывод: никаких неожиданных результатов

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

  • Прогноз: если вы вычитаете число из строки, это приведет к ошибке. Разрешено вычитание числа из логического значения, поскольку логическое значение также может быть представлено как целочисленное значение.
  • Вывод: когда я вычитал число из строки, возвращалось значение «NaN». Вычитание числа из логического значения не привело к аномальным результатам.

Умножение набора отрицательных и положительных чисел.

  • Прогноз: выражения дадут правильный ответ
  • Вывод: никаких неожиданных результатов

Попробуйте объединить несколько операций вместе. Например, 5 + 3–2 * 6 и 5–3 * 2 + 6. Результаты соответствуют вашим ожиданиям?

  • Прогноз: выражения дадут правильный ответ
  • Вывод: никаких неожиданных результатов

Попробуйте умножить данные разных типов.

  • Предсказание: если мы умножим логические значения или числа (или их комбинацию), то выражения дадут правильный ответ. Если мы попробуем умножить строки друг на друга или на числа или логические значения, выражение вернет «NaN».
  • Вывод: никаких неожиданных результатов

Разделите набор отрицательных и положительных чисел.

  • Прогноз: в отличие от Java, когда вы делите отрицательные и положительные числа, остаток будет включен как часть возвращаемого значения.
  • Вывод: никаких неожиданных результатов

Попробуйте объединить несколько операций вместе. Например, 5 / 3–2 * 6 + 8 и 5–3 * 2 + 6 / 8. Результаты соответствуют вашим ожиданиям?

  • Прогноз: выражения дадут правильный ответ
  • Вывод: никаких неожиданных результатов

Попробуйте разделить на 0.

  • Прогноз: сообщение об ошибке
  • Вывод: «Бесконечность» возвращена

Попробуйте разделить различные комбинации типов данных.

  • Прогноз: выражения дадут правильный ответ
  • Вывод: никаких неожиданных результатов

Измените ряд отрицательных и положительных чисел.

  • Прогноз: выражения дадут правильный ответ
  • Вывод: никаких неожиданных результатов

Попробуйте объединить несколько операций вместе.

  • Прогноз: выражения дадут правильный ответ
  • Вывод: никаких неожиданных результатов

Попробуйте изменить число на 0.

  • Прогноз: «Бесконечность» вернется
  • Вывод: никаких неожиданных результатов

Попробуйте выполнить некоторые основные арифметические операции с числами.

  • Прогноз: выражения дадут правильный ответ
  • Вывод: никаких неожиданных результатов

Оператор деления — /. Что произойдет, если вы разделите целое число на другое целое число? Например, 10 / 5. Что произойдет, если целые числа не делятся без остатка? Например 11/5. Как это соотносится с Java? Как вы думаете, почему вы получаете такой результат?

  • Прогноз: 10/5 оценивается как 2. 11/5 оценивается как 2,2. Я считаю, что это отличается от Java, потому что в JavaScript нет определенного типа для целых чисел.
  • В Java, поскольку оба числа являются целыми числами, при делении выражение возвращает целое число (но результат будет неточным, если есть остаток). Однако, если бы одно из целых чисел было числом с плавающей запятой, тогда Java неявно преобразовало бы целое число в число с плавающей запятой, и точность не была бы потеряна.
  • Вывод: никаких неожиданных результатов

Поэкспериментируйте с выражениями, которые объединяют разные типы данных.

  • Прогноз: выражения дадут правильный ответ
  • Вывод: никаких неожиданных результатов

Поэкспериментируйте с выражениями, которые используют скобки (или не используют их).

  • Прогноз: выражения дадут правильный ответ
  • Вывод: никаких неожиданных результатов

Clojure REPL

Сложите несколько чисел, как целых, так и двойных.

  • Прогноз: выражения дадут правильный ответ
  • Вывод: никаких неожиданных результатов

Добавьте набор отрицательных и положительных чисел.

  • Прогноз: выражения дадут правильный ответ
  • Вывод: никаких неожиданных результатов

Попробуйте добавить различные типы примитивных значений и/или строк. Какие результаты вы получаете? Были ли они такими, как вы ожидали? Чем они отличаются от Java?

  • Прогноз: я не верю, что вы сможете добавлять строки к любому из примитивных типов.
  • Вывод: когда я попытался добавить строку в int, я получил ошибку «ClassCastException». Я не ожидал, что Clojure сможет добавлять строки к примитивным значениям. Это отличается от Java тем, что Java позволяет вам конкатенировать строки и примитивные типы, преобразовывая их в строки.

Вычесть ряд отрицательных и положительных чисел.

  • Прогноз: выражения дадут правильный ответ
  • Вывод: никаких неожиданных результатов

Можете ли вы понять, как сочетать сложение и вычитание? Например, как вы могли бы сделать эквивалент 5 + 3–2?

  • Прогноз: (+ 5 (- 3 2)) или ( + 5 3 (- 2))
  • Вывод: никаких неожиданных результатов

Умножение набора отрицательных и положительных чисел.

  • Прогноз: выражения дадут правильный ответ
  • Вывод: никаких неожиданных результатов

Разделите набор отрицательных и положительных чисел.

  • Прогноз: выражения дадут правильный ответ
  • Вывод: вместо того, чтобы получать целое или десятичное значение, Clojure возвращал дробь. По-видимому, в Clojure целочисленное деление дает рациональные числа. Если я использую число с плавающей запятой, то ответ возвращается в виде десятичного числа.

Попробуйте разделить как целые, так и двойные числа на 0.

  • Прогноз: сообщение об ошибке
  • Вывод: никаких неожиданных результатов. Отображается исключение ArithmeticException (деление на ноль).

Измените ряд отрицательных и положительных чисел.

  • Прогноз: выражения дадут правильный ответ
  • Вывод: никаких неожиданных результатов

Попробуйте изменить более двух значений. Что случается? Чем это отличается от того, что мы видели до сих пор?

  • Прогноз: выражение будет оцениваться как правильный ответ
  • Вывод: когда вы модифицируете более двух значений, например так: (mod 3 11 4), Clojure жалуется и заявляет, что вы передали неправильное количество аргументов. Это отличается тем, что вам разрешено вводить более двух значений для деления.

Попробуйте изменить как целые числа, так и удвоения на 0.

  • Прогноз: сообщение об ошибке
  • Вывод: никаких неожиданных результатов

Попробуйте убрать скобки. Что происходит?

  • Прогноз: сообщение об ошибке
  • Вывод: никаких неожиданных результатов

Попробуйте удалить пробелы из выполнения функций. Что происходит?

  • Прогноз: Clojure будет искать арифметическую функцию (/, -, +), но не сможет ее идентифицировать (поскольку между функцией и значением нет пробела), что приведет к сообщению об ошибке.
  • Вывод: нет неожиданного результата

Попробуйте составить более сложные выражения, используя целые числа и двойные числа.

  • Прогноз: проверено с использованием следующего выражения: (- 2 (* 8 2.0)). Выражение будет оцениваться как правильный ответ.
  • Вывод: никаких неожиданных результатов

Поэкспериментируйте с положительными и отрицательными числами.

  • Прогноз: выражения дадут правильный ответ
  • Вывод: нет неожиданного результата

Попробуйте добавить в свои выражения несколько различных типов данных, таких как строки и логические значения. Что происходит?

  • Прогноз: сообщения об ошибках. Протестировано с использованием (- «ввод» верен)
  • Вывод: когда я попытался добавить строку с логическим значением, я получил ClassCastException.

Сравните эти выражения. Чем они отличаются? Чем отличаются их результаты? Если они отличаются, то почему?

Все три приведенных ниже выражения оцениваются как 8,75 (или 35/4).

(/ (* (- 42 (+ 8 24)) (/ (+ 7 (+ 4 3)) 2)) 8)

  • Это выражение использует только целые числа и, следовательно, возвращает дробный результат 35/4.

(/ (* (- 42 (+ 8 24)) (/ (+ 7 (+ 4 3)) 2)) 8.0)

  • В этом выражении используются как целые числа, так и десятичное значение. Он оценивается в 8,75.

(/ (* (- 42 (+ 8 24)) (/ (+ 7 (+ 4.5 2.5)) 2)) 8)

  • В этом выражении используются как целые числа, так и десятичное значение. Следующее выражение отличает его от двух других выражений выше: (+ 4,5 2,5)

Прежде чем запускать этот пример, подумайте, чему равно 4,5 + 2,5. Как вы думаете, как это изменит результат?

  • Прогноз: это не изменит результат (поскольку сложение этих двух значений по-прежнему дает вам 7).
  • Вывод: значение вывода такое же, как и два других выражения.