当我运行此代码时,没有任何反应:
#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)
为什么第一个代码段没有运行?如何输出四个圆圈?
谢谢!
答案 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