Dictionary 地图在方案中的应用

Dictionary 地图在方案中的应用,dictionary,functional-programming,scheme,Dictionary,Functional Programming,Scheme,我试图理解程序的应用和方案中的计算顺序。 我有以下代码: (map map (list map) (list (list list)) '(((a b c)))) 我知道map应以以下方式应用: (map procedure list list ...) 如果给出了多个列表,则它们的长度必须相同。 上述行的结果是: (map map (list map) (list (list list)) '(((a b c)))) => ((((a) (b) (c)))) 为什么??这里的计算顺

我试图理解程序的应用和方案中的计算顺序。 我有以下代码:

(map map (list map) (list (list list)) '(((a b c))))
我知道
map
应以以下方式应用:

(map procedure list list ...)
如果给出了多个列表,则它们的长度必须相同。 上述行的结果是:

(map map (list map) (list (list list)) '(((a b c))))
=> ((((a) (b) (c))))
为什么??这里的计算顺序是什么? 我试图打破界限,显然我遗漏了一些东西:

(list map)
=> (#<Function map>)     ;list1
(list (list list))
=> ((#<Function list>))  ;list2
'(((a b c)))
=> (((a b c)))           ;list3
(列表映射)
=> (#)     ;清单1
(名单)
=> ((#))  ;清单2
"(((a b c))
=>((a b c));清单3

地图的正确用法是:

(映射过程列表1…列表n)
因此,如果你有一个列表,你的进程应该有一个参数。未定义求值顺序,因此
listn
的表达式可以位于
map
求值之前(其求值为过程)。您可以通过使用具有副作用的参数来测试这一点,并看到它通常是从左到右或从右到左

嵌套表达式,就好像
proc-of-n-arity
是一个复杂的过程调用,其自身的表达式在应用
map
之前进行求值,因为它需要在应用之前进行求值,因此即使顺序未知,我们知道它是深度优先求值

回到你奇怪的表情:

(地图地图(列表地图)(列表(列表))”((a b c)))
此处
map
计算为一个过程。它计算
map
作为它的第一个参数的一个过程,并计算其余的表达式,这样您就可以得到
(#)
(#)((#))当然还有
((abc))
,所有的一个元素列表。因此,您应该期望返回一个元素列表,结果如下:

(地图(列表)“((a b c)))
这将把
map
作为一个过程进行评估,并将列表作为
(#)
((a b c))
进行评估。由于它是一个单元素列表,因此我们再次期望返回一个单元素列表,结果如下:

(地图列表(a b c))
这将
映射
列表
计算为过程,第二个参数计算为
(a b c)
。您将得到一个包含3个元素的列表,其结果是
list
,每个元素有一个,即
((a)(b)(c))

回到事实上,这是
map
应用程序中的一个元素,我们知道
map
会用它制作一个列表,就像
((a)(b)(c))
一样,它是外部
map
中的一个元素,也是列表中的一个元素,因此
((a)(b)(c))
是最终的结果

要知道,通过以下方法可以更轻松地实现此结果:

(列表(列表(地图列表(caar))((a b c()()))))
列表参数长度 请注意,对于R5RS和R6RS中的
map
,对相同长度列表的限制是正确的,但SRFI-1将在最短列表处停止。例如:

#!r6rs
(导入(rnrs基本地图除外)
(仅限(srfi:1)地图循环列表)
(地图+'(1 2 3)(循环列表2));=>(3 4 5)
将成为R7RS中的标准列表库