Ошибка компилятора Clojure - PullRequest
0 голосов
/ 22 апреля 2011

Я работаю над программой clojure, которая включает следующие строки кода:

(defn makeStruct 
 "Take a line of input and return a starbucks-struct"
 [input]
 (let[(apply struct storeinfo (clojure.string/split input #","))]
 )

)

И я получаю эту ошибку компилятора:

Exception in thread "main" java.lang.IllegalArgumentException: let requires an even number of forms in binding vector (clojureHW.clj:24)

Я очень плохо знаком с clojure и не совсем уверен, что делаю, но в этом случае input - это строка, и я разделяю ее на вектор для инициализации своей структуры. Я неправильно использую синтаксис let?

Ответы [ 3 ]

5 голосов
/ 22 апреля 2011

let требует четного числа форм, потому что привязывает значения к локальным:

(let [x 10,
      y (+ x 20)]
   ; do something with x and y here
   (* x y))

Пожалуйста, прочитайте документацию здесь: http://clojure.org/special_forms#Special%20Forms--(let%20%5Bbindings*%20%5D%20exprs*)

0 голосов
/ 22 апреля 2011

Сторона "связывания" выражения let может иметь только символы и формы деструктурирования, такие как векторы и карты.Сторона связывания let не может оценить выражение типа (apply struct storeinfo).

0 голосов
/ 22 апреля 2011

Я думаю, у вас все еще есть недопонимание в отношении способа обработки возвращаемых значений и привязок.

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

У вас есть

(apply struct storeinfo (clojure.string/split input #","))

Возвращает значение, потому что есть только одно выражение. Это довольно просто, просто посчитай большинство парней.

А поскольку у вас больше ничего нет в let, у вас есть нечетное количество форм (выражений) в let.

...