1

方案是否具有调用函数 n 次的函数。我不想要 map/for-each 因为该函数没有任何参数。类似这样的东西:-

(define (call-n-times proc n)
        (if (= 0 n)
            '()
            (cons (proc) (call-n-times proc (- n 1)))))

(call-n-times read 10)
4

2 回答 2

2

SRFI 1有一个list-tabulate函数,可以通过调用给定函数来构建列表,参数为 0 到(- n 1). 但是它并不能保证执行的顺序(实际上很多实现都是从头到尾(- n 1)),所以不适合read用with调用。

在 Racket 中,您可以这样做:

(for/list ((i 10))
  (read))

调用read10 次并收集每次的结果;它会从左到右完成。但是由于您将问题标记为 Guile,我们需要做一些不同的事情。

幸运的是,Guile 有SRFI 42,它使您能够:

(list-ec (: i 10)
  (read))
于 2014-01-24T10:25:20.067 回答
0

手动实现尾递归模 cons优化,以构建具有 O(1) 额外空间的结果列表:

(define (iterate0-n proc n)   ; iterate a 0-arguments procedure n times
  (let ((res (list 1)))       ; return a list of results in order
    (let loop ((i n) (p res))
      (if (< i 1)
        (cdr res)
        (begin
          (set-cdr! p (list (proc)))
          (loop (- i 1) (cdr p)))))))

这种技术首先(?)在弗里德曼和怀斯的 TR19中描述。

于 2014-01-24T17:19:33.810 回答