スキームには、関数を 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)
SRFI 1には、指定されたlist-tabulate関数を呼び出してリストを構築できる関数があり、引数は 0 から まで(- n 1)です。ただし、実行の順序を保証するものではありません (実際、多くの実装は から開始し(- n 1)てダウンします) read。
Racket では、次のことができます。
(for/list ((i 10))
(read))
10 回呼び出しreadて、それぞれの結果を収集します。そしてそれは左から右に行われます。しかし、あなたが Guile の質問にタグを付けたので、別のことをする必要があります。
幸いなことに、Guile にはSRFI 42があり、次のことが可能です。
(list-ec (: i 10)
(read))
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 と Wise の TR19で最初に (?) 説明されました。