2014-01-24 50 views
0

方案有功能調用功能n次。我不希望map/for-each函數沒有任何參數。沿此線的東西: -方案功能調用程序n次

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

(call-n-times read 10) 

回答

2

SRFI 1list-tabulate功能,可以從調用給定函數通過(- n 1)建立一個列表,帶有參數0。但是,它並不能保證執行的順序(實際上,許多實現從(- n 1)開始並下降),所以它不適合用於調用read

球拍,你可以這樣做:

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

調用read 10次,每次收集的結果;這將從左到右完成。但是既然你把你的問題標記爲Guile,我們需要做一些不同的事情。

幸運的是,狡詐具有SRFI 42,使您能夠做到:

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

很酷。我現在會用我自己的一個。我想知道他們爲什麼離開這個標準。很高興知道這不是太明顯:) – Himanshu

+2

@Himanshu Scheme,至少在早期版本中,是一個非常簡單的語言。事實上,這是一個非常簡單的工具來編寫是一個很好的理由,讓它脫離語言。 「只有三條線,寫起來很容易,我們不需要把它寫入規範。」 :) –

+0

@JoshuaTaylor是的,聽起來很合理。我認爲Scheme最小化是最有吸引力的功能。 – Himanshu

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中描述。