Я пытаюсь немного углубиться в замыкание и функциональное программирование.
В какой-то момент моего кода у меня есть (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)) )
Но я не совсем уверен, является ли это "правильным" решением?