在Scheme中实现"Pythonic"地图:坏主意?

Sup*_*ric 5 scheme list-comprehension map-function

在Scheme中,函数(map fn list0 [list1 .. listN])带有限制,列表必须具有相同数量的元素.来自Python,我缺少Python列表推导的自由,它看起来很像map上面,但没有这个限制.

我很想实现一个替代的"my-map",它允许不同大小的列表,遍历所有列表的前N个元素,其中N是最短列表的长度.

例如,让我们num可以10lst(1 2 3).使用my-map,我希望编写如下表达式:

(my-map + (circular-list num) lst)))
Run Code Online (Sandbox Code Playgroud)

得到:

(11 12 13)
Run Code Online (Sandbox Code Playgroud)

我比阅读传统书更容易阅读本书

(map + (lambda (arg) (+ num arg)) lst)
Run Code Online (Sandbox Code Playgroud)

要么

(map + (make-list (length lst) num) lst) 
Run Code Online (Sandbox Code Playgroud)

两个问题:

  • 作为一个方案新手,我是否忽略了限制"地图"的重要原因?
  • 在Scheme或SRFI中是否存在类似"my-map"的内容?我确实看了一下srfi-42,但要么它不是我想要的,要么就是,而且不是很明显.

Eli*_*lay 7

首先,请注意,map 它确实允许空列表,但当然如果有一个空列表,则所有列表都应为空.

其次,看看srfi-1版本map - 它与R5RS版本有明显不同,如下所示:

此过程从其R5RS规范扩展到允许参数长度不等; 当最短列表用完时它会终止.

第三,大多数Scheme程序员都非常喜欢

(map (lambda (arg) (+ num arg)) lst)
Run Code Online (Sandbox Code Playgroud)

我的猜测是,Scheme与Python的不同之处在于,lambda当你习惯了语言时,表达式会变得越来越可读.

最后,有一些实现带有某种形式的列表理解.例如,在Racket中你可以写:

(for/list ([arg lst]) (+ num arg))
Run Code Online (Sandbox Code Playgroud)