Chức năng seq
ngay bây giờ chỉ thực hiện điều này:
(. clojure.lang.RT (seq coll))
Trong RT.java
trong phiên bản mới nhất của Clojure, bạn sẽ tìm thấy:
static public ISeq seq(Object coll){
if(coll instanceof ASeq)
return (ASeq) coll;
else if(coll instanceof LazySeq)
return ((LazySeq) coll).seq();
else
return seqFrom(coll);
}
static ISeq seqFrom(Object coll){
if(coll instanceof Seqable)
return ((Seqable) coll).seq();
else if(coll == null)
return null;
else if(coll instanceof Iterable)
return IteratorSeq.create(((Iterable) coll).iterator());
else if(coll.getClass().isArray())
return ArraySeq.createFromObject(coll);
else if(coll instanceof CharSequence)
return StringSeq.create((CharSequence) coll);
else if(coll instanceof Map)
return seq(((Map) coll).entrySet());
else {
Class c = coll.getClass();
Class sc = c.getSuperclass();
throw new IllegalArgumentException("Don't know how to create ISeq from: " + c.getName());
}
}
An ASeq
hoặc LazySeq
đã là một seq. Một Seqable
là một cái gì đó mà biết làm thế nào để trả lại một seq của chính nó.
Điều đó để lại những thứ như các lớp lõi Java, cần phải có thể bắt giữ nhưng Clojure không thể thay đổi để thêm phương thức seq
. Những mã này hiện được mã hóa cứng vào danh sách này. Tôi sẽ không ngạc nhiên nếu việc thực hiện thay đổi một ngày nào đó, có thể sử dụng các giao thức để mở rộng các lớp lõi Java thay thế?
Nguồn
2010-10-26 18:34:30
@kotarak cảm ơn bạn đã sửa liên kết :) –
Tôi tin rằng điều này đã chuyển ... mọi cập nhật về vị trí của nó? – jayunit100
Trong phiên bản hiện tại của Clojure (1.5) có thể truy cập được? hiện đang sống trong clojure.core.incubator (repo @ https://github.com/clojure/core.incubator) –