باز هم من و یه تابع که نمیتونم رفتارشو توجیه کنم
این قسمت، تابع range
.
میدونیم که range یه lazy sequence میسازه. مثلا این:
user=> (range 5)
(0 1 2 3 4)
و اگه بخوایم هر قدم به اندازهی 0.5 باشه میشه این:
user=> (range 0 5 0.5)
(0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5)
تا اینجا همه چیز تحت کنترله. ولی چرا وقتی میخوایم به میزان 0.1 قدم پیش بریم، اینطوری میشه؟
user=> (take 10 (range 0 5 0.1))
(0 0.1 0.2 0.30000000000000004 0.4 0.5 0.6 0.7 0.7999999999999999 0.8999999999999999)
کسی میدونه چرا Rich Hickey با من از این شوخیا میکنه؟
ببینید منطقی نیست دیگه. اینو به خودش نشون بدیم قبول نمیکنه.
(= 0.30000000000000004 0.3)
سورس کدی که توی داکیومنت لینک داده بود برای range
اینه که چون طولانیه، یه تیکهی مهمشو اینجا مینویسم:
(clojure.lang.LongRange/create start end step)
که واضحه داره یه کد جاوا رو اجرا میکنه. این کد:
return new LongRange(start, end, step, positiveStep(end));
ولی مغزم خستهتر از چیزیه که ادامهی داستانو رمزگشایی کنم.