Ваш тест - основная программа, стиль C. Не делай этого. Напишите вашу программу как именованные функции и используйте REPL для их осуществления. Для начала, это отделяет ошибки компиляции от ошибок выполнения.
Я назвал вашу функцию area
. Первая кровь, отобранная компилятором, ...
Syntax error compiling at (amuse.clj:24:39).
Unable to resolve symbol: rectangleArea in this context
Совершенно верно. Вы не указали let
или def
значение для rectangleArea
. Удаление и повторная попытка приводит к аналогичной ошибке:
Syntax error compiling at (amuse.clj:24:39).
Unable to resolve symbol: Width in this context
Проблема в том, что, как заметил Джурай Мартинка , вы находитесь за пределами привязки let
для Width
, когда вы ссылаетесь к этому. Удаляя Width
, мы получаем чистую компиляцию. Давайте попробуем вызвать функцию:
=> (area)
To compute the area of a rectangle,
enter its width: 8
enter its height: 9
Execution error (ClassCastException) at amuse/area (amuse.clj:24).
java.lang.Long cannot be cast to clojure.lang.IFn
Что происходит? Вызов printf
оценивает выражение (Height)
, которое в этом случае пытается вызвать номер 8.0
как функцию.
Старайтесь также избегать взаимодействия ввода / вывода в ваших функциях. Аргументы и результаты лучше. Вы можете использовать аргументы ключевого слова и возвращать карты, чтобы передать смысл. Ваша функция может быть написана ...
(defn area [& {:keys [height width]}]
{:area (+ height width)})
Это выглядит странно, но легко в использовании:
=> (area :height 8 :width 9)
{:area 17}
Это правильно? Я так не думаю. Мы должны умножить, а не добавить:
(defn area [& {:keys [height width]}]
{:area (* height width)})
amuse=> (area :height 8 :width 9)
{:area 72}
Таким образом, наша функция по сути является синонимом *
.
Если бы я был на вашем месте, я бы позволил REPL сейчас принять на себя всю ответственность за подтверждение. Если у вас есть серьезная работа, вы найдете Clojure spe c очень удобным.
Всего наилучшего.