2016-01-10 4 views
1

http://www.4clojure.com/problem/23: «Написать функцию, которая переворачивает последовательность»Clojure сравнить последовательность в вектор

Одним из решений является (fn [x] (reduce conj() x)), который проходит все тесты. Тем не менее, мне очень интересно, почему это решение работает для первого теста:

(= (__ [1 2 3 4 5]) [5 4 3 2 1]) 

встраивания функции вычисляет true в РЕПЛ:

(= ((fn [x] (reduce conj() x)) [1 2 3 4 5]) [5 4 3 2 1]) 
true 

Однако, если я оцениваю первый аргумент = , Я получаю (5 4 3 2 1) и (= (5 4 3 2 1) [5 4 3 2 1]) выбрасывает ClassCastException.

Почему первая работая, а вторая нет? Похоже, что они должны быть эквивалентными ...

ответ

2

Проблема в том, что ваш список буквально (5 4 3 2 1) оценивается как вызов функции. Для того, чтобы использовать его правильно, вы должны процитировать, например, так:

(= '(5 4 3 2 1) [5 4 3 2 1]) ;; => true

1

другой способ сделать это без снижения является использование into() , как это работает exatcly в качестве сокращения. Поэтому, когда вы заполняете этот пул, он решает задачу:

(= (into() [1 2 3 4 5]) [5 4 3 2 1]) ;; true 
(= (into() (sorted-set 5 7 2 7)) '(7 5 2)) ;; true 
(= (into() [[1 2][3 4][5 6]]) [[5 6][3 4][1 2]]) ;; true 
+0

Nice! Просто начав с Clojure, поэтому я не знал о 'in' – FeifanZ

Смежные вопросы