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