LINUX.ORG.RU

История изменений

Исправление 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 не подключать?