История изменений
Исправление monk, (текущая версия) :
то ему придется менять шаг и перерасчитывать количество
Если предполагается, что нужно будет менять количество шагов и оно будет неизвестно (но будет известен шаг и границы), то можно сделать расчётно:
(define (iota* start stop step)
(iota (/ (- stop start) step) step))
...
(iota* #e-1 #e1 #e0.1)
Велосипед ничем не хуже библиотечной функции, но не требует библиотеки (камон, подключать всю srfi ради одной функции)
Спорно. Чтение проще с известными библиотечным функциями. Даже первый вариант с
(do ((i #e-1 (+ i #e0.1)))
((= i #e1) i)
(displayln (exact->inexact (Pn i n)))))
читается проще, чем
(map (lambda (i) (displayln (exact->inexact (Pn i n))))
(iterate-while (lambda (i) (+ i #e0.1))
(lambda (i) (= i #e1))
#e-1)))
если принципиально собрать список, то
(map (lambda (i) (exact->inexact (Pn i n)))
(do ((i #e-1 (+ i #e0.1))
(l null (cons i l)))
((= i #e1) (reverse l))))
На полстрочки больше, чем с iterate-while, зато сразу понятно, что этот кусок делает.
P.S. В Си тоже вместо strcpy(a,b); будете писать {char *t1 = a, *t2 = b; while(*t1++ = *t2++); } чтобы весь string.h не подключать?
Исходная версия monk, :
то ему придется менять шаг и перерасчитывать количество
Если предполагается, что нужно будет менять количество шагов и оно будет неизвестно (но будет известен шаг и границы), то можно сделать расчётно:
(define (iota* start stop step)
(iota (/ (- stop start) step) step))
...
(iota* #e-1 #e1 #e0.1)
Велосипед ничем не хуже библиотечной функции, но не требует библиотеки (камон, подключать всю srfi ради одной функции)
Спорно. Чтение проще с известными библиотечным функциями. Даже первый вариант с
(do ((i #e-1 (+ i #e0.1)))
((= i #e1) i)
(displayln (exact->inexact (Pn i n)))))
читается проще, чем
(map (lambda (i) (displayln (exact->inexact (Pn i n))))
(iterate-while (lambda (i) (+ i #e0.1))
(lambda (i) (= i #e1))
#e-1)))
если принципиально собрать список, то
(map (lambda (i) (exact->inexact (Pn i n)))
(do ((i #e-1 (+ i #e0.1))
(l null (cons i l)))
((= i #e1) (reverse l))))
На полстрочки больше, чем с iterate-while, зато сразу понятно, что этот кусок делает.
P.S. В Си тоже вместо strcpy(a,b); будете писать {char *t1=a, *t2 = b; while(*a++ = *b++); } чтобы весь string.h не подключать?