方案是否具有调用函数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)
答案 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中描述。