Выполнить две команды подряд после оператора if в Clojure - PullRequest
17 голосов
/ 26 сентября 2011

Почему следующая программа Clojure генерирует исключение NullPointerException?

user=> (defn x []  
       "Do two things if the expression is true."
       (if true ((println "first expr") (println "second expr")) false))

user=> (x)
first expr
java.lang.NullPointerException (NO_SOURCE_FILE:0)
second expr

Это упрощенная версия моего фактического варианта использования, где я хочу выполнить, возможно, три оператора (извлекать значения из БД) перед возвратомкарта - {:status 200, :body "Hello World"} внутри филиала.

Ответы [ 3 ]

34 голосов
/ 26 сентября 2011

Он пытается обработать результат первого println как функцию для вызова второй функции println.

Вам необходимо do.

(defn x []  
   "Do two things if the expression is true."
   (if true (do (println "first expr") (println "second expr")) false))

(x)

Специальная форма do (progn в CL, начало в Scheme) последовательно выполняет каждый из своих аргументов и возвращает результат последнего.

11 голосов
/ 26 сентября 2011

Если nil нормально в качестве возвращаемого значения в другом случае, рассмотрите возможность использования when, который имеет неявный блок do:

(defn x []  
  "Do two things if the expression is true."
  (when true
    (println "first expr") 
    (println "second expr")))
7 голосов
/ 26 сентября 2011

Не то, чтобы это имело значение в вашем конкретном случае, но вы знаете разницу между (do ...), который загрузит каждую форму в свой собственный загрузчик классов, и пустой формой let (let [] ...), которая оценивает всю форму в одном загрузчике классов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...