Почему Clojure приводит строку к символу с минусами

Я поиграл с последовательностями в REPL и столкнулся со следующим поведением, которое, по крайней мере для меня, довольно неинтуитивно. Итак, я вычислил выражение (cons '("1" "2") "3"), ожидая, что оно даст (("1" "2") "3"), но вместо этого оно дало (("1" "2") \3).

Может ли кто-нибудь объяснить, почему Clojure автоматически принуждает string к character в этом случае? Я предполагаю, что это как-то связано с внутренним представлением строки в виде последовательности символов.


person Markus    schedule 30.08.2015    source источник
comment
cons приводит строку не к символу, а к символьной последовательности.   -  person Thumbnail    schedule 31.08.2015


Ответы (2)


Второй аргумент cons — это последовательность:

(минусы х последовательность)

Возвращает новую последовательность, где x — первый элемент, а seq — остальные.

Теперь вы должны знать, что clojure автоматически создает для вас последовательность, если вы ее не дадите. Например, вызов seq (что делает cons для вас) покажет вам, что строка преобразуется в последовательность символов:

(seq "32")
=> (\3 \2)

Это делается с помощью среды выполнения clojure в RT. Java:

else if(coll instanceof CharSequence)
    return StringSeq.create((CharSequence) coll);

Вместо этого, если вы хотите, чтобы персонаж рассматривался как один элемент, вы можете обернуть его:

(cons '("1" "2") '("3"))
=> (("1" "2") "3")
person ClojureMostly    schedule 30.08.2015

Это не приведение строки к символу, это приведение строки к последовательности символов, потому что второй аргумент должен быть коллекцией.

cons принимает элемент в качестве первого аргумента, а коллекцию — в качестве второго. Коллекция преобразуется в список с помощью функции seq.

user=> (seq "3")
(\3)

Если вы хотите использовать cons для добавления списка ("1" "2") к списку ("3"), вы можете сделать следующее:

user=> (cons '("1" "2") '("3"))
(("1" "2") "3")

Возможно, вы хотите использовать (("1" "2") . "3"), вид cons-элементов без списка, которые вы можете использовать в других lisps, но в Clojure просто нет такой пары cons-элементов.

person noisesmith    schedule 30.08.2015