scheme函数调用一个过程n次

时间:2014-01-24 07:54:49

标签: scheme guile

方案是否具有调用函数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)

2 个答案:

答案 0 :(得分:2)

SRFI 1有一个list-tabulate函数,可以通过调用给定函数构建一个列表,参数为0到(- n 1)。但是,它并不能保证执行的顺序(事实上,许多实现都是从(- n 1)开始并且向下),因此用read调用它是不理想的。

在Racket中,你可以这样做:

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

拨打read 10次并收集每个的结果;它将从左到右完成。但是既然你为Guile标记了你的问题,我们需要做些不同的事情。

幸运的是,Guile有SRFI 42,可以让你做到:

(list-ec (: i 10)
  (read))

答案 1 :(得分:0)

手动实施tail-recursion modulo 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)))))))

这项技术首先(?)在Friedman and Wise's TR19中描述。