Выполнение нескольких операторов в if-else без исключения nullpointer - PullRequest
41 голосов
/ 04 июня 2011

Я пытаюсь немного углубиться в замыкание и функциональное программирование.

В какой-то момент моего кода у меня есть (def server (spawn-server)). Теперь я хочу, чтобы функция REPL проверяла состояние этого сокета.

Вот что у меня сейчас:

(defn status []
  (if server 
    (
      (println "server is up and running")
      (println "connections:" (connection-count server)) 
     )    
    (println "server is down")))

Если сервер ноль, все работает нормально, но это вывод на REPL, если сервер работает:

=> (status)
server is up and running
connections: 0
#<CompilerException java.lang.NullPointerException (NO_SOURCE_FILE:0)>

Я не совсем уверен, вижу ли я проблему, но я не могу понять, как это должно работать :-) Вот что у меня есть:

((println "foo")(println "foo"))

которое будет оценено как (nil nil), что приведет к исключению NullPointerException?

Обычно я бы не использовал внешние скобки, но как я могу создать какой-то оператор "block" для условия if. Если я их не использую, второй println будет использоваться как и все.

Что будет работать, так это использование let в качестве некоего «блочного» выражения:

(let [] 
  (println "server is up and running"),
  (println "connections:" (connection-count server)) )

Но я не совсем уверен, является ли это "правильным" решением?

1 Ответ

60 голосов
/ 04 июня 2011

Использование do:

(defn status []
  (if server 
    (do
      (println "server is up and running")
      (println "connections:" (connection-count server)))    
    (println "server is down")))

В Лиспе, как правило, вы не можете просто добавить парены для группировки.

((println "foo") (println "foo"))

Здесь возвращается значение первого *Будет пытаться вызываться 1008 * (как функция) с возвращаемым значением секунды в качестве аргумента.Это очень простые правила оценки, поэтому я предлагаю вам ознакомиться с некоторыми вводными книгами или документацией о Clojure или Лиспе в целом.*:

Непустые списки считаются вызовами специальных форм, макросов или функций.Вызов имеет форму (операнды оператора *).

Макросы или специальные формы могут «нарушать» это правило.

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