为什么for / list在正常for循环时没有运行?

时间:2016-11-01 20:22:35

标签: scheme racket

当我运行此代码时,没有任何反应:

#lang slideshow
(define (execute-n-times f n)
  (for ([i n])
    f))
(execute-n-times (circle 20) 4)

但是如果我使用for / list运行完全相同的东西,它会输出一个包含四个打印圆圈的列表:

#lang slideshow
(define (execute-n-times f n)
  (for/list ([i n])
  f))
(execute-n-times (circle 20) 4)

为什么第一个代码段没有运行?如何输出四个圆圈?

谢谢!

4 个答案:

答案 0 :(得分:1)

for是一种特殊形式,其中每次迭代都会执行正文,因为它的副作用是从不保留。副作用的一个例子可能是打印,存储到文件或变异数据结构。

for/list是一种特殊形式,与for相同,但每个结果都会累积到结果list上。 for/vector执行相同的操作,但是您可以在向量中获得每次迭代的结果(也可以在其他语言中使用caled数组)。

代码中的名称令人困惑。 execute-n-times不会执行任何操作,只需返回f的值,该值恰好是执行(circle 20) 的评估值

要在每次需要f成为函数和身体来调用该函数时执行它:

(define (execute-n-times f n)
  (for/list ([i n])
    (f i)))

(execute-n-times (lambda (n) (circle (* n 10))) 4)

为了看到差异,我通过了更改为函数的值,使得每次迭代时圆的大小不同。

答案 1 :(得分:1)

其他答案完全正确。我还要补充一点:

尝试将(circle 20)替换为(+ 3 4)。现在结果有意义吗?

答案 2 :(得分:0)

for/list在列表中累积循环体的评估值。 for没有。

请考虑以下是for/list for编写#lang slideshow (define (execute-n-times f n) (let ((l '())) (for ([i n]) (set! l (cons f l))) (reverse l)) ) (execute-n-times (circle 20) 4) 的一种方式:

>>> bulk_insert_string = r"BULK INSERT my_table FROM {} WITH (FIELDTERMINATOR = ';', ROWTERMINATOR = '\n')".format(
    os.path.join('C:', os.sep, 'data_import_folder', 'my_import_filename' + '.txt'))

答案 3 :(得分:0)

使用其他for loops也可能会澄清问题:

(for/list ((i 5))
  i)
(for/vector ((i 5))
  i)

(for/sum ((i 5))
  i)
(for/product ((i 5))
  i)

(for/first ((i 5))
  i)
(for/last ((i 5))
  i)

输出:

'(0 1 2 3 4)        ; a list
'#(0 1 2 3 4)       ; a vector
10                  ; sum
0                   ; product
0                   ; first
4                   ; last

" For"本身只产生空白:

(println (for ((i 5))
  i))

输出:

#<void>

以下是&#34; for&#34;的典型用法:

(for ((i 5))
  (println i))

输出:

0
1
2
3
4