строк можно напрямую индексировать, не создавая последовательность с тех пор и не беря первую из этой последовательности.
(= (nth "clojure" 0) \c)
=> true
nth вызывает этот код Java:
static public Object nth(Object coll, int n){
if(coll instanceof Indexed)
return ((Indexed) coll).nth(n); <-------
return nthFrom(Util.ret1(coll, coll = null), n);
}
, который эффективно читает символ непосредственно.
первый вызов этого java-кода:
static public Object first(Object x){
if(x instanceof ISeq)
return ((ISeq) x).first();
ISeq seq = seq(x); <----- (1)
if(seq == null)
return null;
return seq.first(); <------ (2)
}
, который создает последовательность для строки (1) (создание последовательности очень быстро), а затем получает первый элемент из этой последовательности.(2).после возврата seq является мусором.
Очевидно, что Seqs - это самый нелепый способ получить доступ к чему-либо последовательному в clojure, и я их вообще не стучу.Интересно знать, что вы создаете когда.переключение всех ваших вызовов на first
с вызовами на nth
может быть преждевременной оптимизацией. если вы хотите, чтобы в строке был 100-й символ, я бы предложил использовать индексированную функцию доступа, например, nth
.