Получение более полезных предупреждений при компиляции Clojure - PullRequest
0 голосов
/ 05 мая 2018

В функции ниже я использовал cond вместо case. Мне потребовалось много времени, чтобы выделить эту функцию. Я изучаю clojure, поэтому ошибка не была очевидна для меня. Когда я попытался запустить код до функции map (используя отладчик cursive / Intellij), Intellij пожаловался: There is no executable code at core.clj:144. Если компилятор clojure знает об этом, есть ли возможность получить предупреждение во время компиляции? Существуют ли другие проверки, которые компилятор (или пух) может сделать в моем коде?

(defn uri-gen [uri fields line]
  (let [remo "[//\\:*?()<>|.%'\"&]"]
    (cond (count fields)
      0 (correct-uri ...)
      1 (let ...)
      (correct-empty
        uri
        (apply str
          (map (fn [it] ...)))))))

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Это не проблема компилятора.

С точки зрения компилятора , то, что вы написали, имеет смысл. У вас есть s-выражение, состоящее из s-выражения, за которым следуют дополнительные s-выражения - в чем проблема? Лисп, такой как Clojure, чертовски мало "синтаксис" для компилятора, чтобы "знать" " около. Например, не нужно беспокоиться о глупых вещах, таких как приоритет операторов и операторы «если» и «пока» и «до», а также о множестве других вещей, которые компиляторы для других языков колеблются. Он не знает, что делают cond и case и and и whatever - он просто знает, что, поскольку они являются первым значением в форме без кавычек, они должны быть функцией; компилятор может в некотором смысле «найти» эту функцию, поэтому он может создать код для вызова функции; за ним следует множество других допустимых выражений, которые нужно передать в функцию. (И, конечно, эти другие выражения могут состоять из большего количества s-выражений, представляющих больше функций, которые должны быть вызваны, и мы идем вниз по Лисп-дыре!). KEWL! Это функция , которая должна иметь некоторый смысл передаваемых аргументов и делать то, что должна делать функция. Компилятор ничего не знает обо всем этом - в очень упрощенном смысле он просто читает s-выражения и генерирует код для вызова функций.

Если вы настаиваете на передаче case -ish аргументов cond, компилятору все равно . Он будет весело делать то, что вы просили . Тот факт, что cond будет (вероятно) препятствовать всем этим аргументам, не то, что компилятор должен решать - это проблема программиста . Lisp / Clojure возлагает ответственность за то, чтобы все было прямо на плечах программиста, которому он принадлежит.

Lisp - это своего рода супер-сила для программистов. В правильных руках это ценный инструмент на службе человечества. В чужих руках это рецепт катастрофы. Постарайтесь не затягивать - используйте свои силы с умом. : -)

0 голосов
/ 05 мая 2018

К сожалению, предупреждения и сообщения об ошибках в Clojure часто бывают краткими, бессмысленными или просто отсутствуют.

Я не уверен, поможет ли это в этом случае, но вы можете попробовать инструмент eastwood Clojure lint (см. Другие в Clojure Toolbox). Я также широко использую Plumatic Schema, которая помогла мне избежать многих простых ошибок типов.

...