我有兴趣为我的语言定义一个并行映射运算符。它将列表转换为给定表达式的新列表。它的语法类似于生成器。与C#和Python中的生成器不同,如果编译器需要(例如,存在空闲核心,并且列表非常大),它可能会并行评估。它将被称为witheach
,以区别于顺序执行的foreach
。
例如考虑:
var f = function(int x) : int { return x * 2; }
var my_list = 0..1000000;
var my_mapped_list = witheach (i in mylist) yield f(i);
我的问题是,对于那些可能会在f
中产生副作用的程序员来说,这是否太不直观了?当然,我会说不要在文档中这样做,但大多数程序员不会阅读语言文档。 : - )
我想更大的问题是,现代程序员能否适应他们语言中的隐式并行列表处理语义,还是他们需要更明确的事情呢?
答案 0 :(得分:2)
你说得对,大多数用户都不会阅读文档,因此可能会将非线程安全的代码放在witheach
块中(特别是名称和语法与{{1}相似}})。您要么必须信任您的用户,要么对该块的并发安全性执行一些静态分析。如果您选择了较晚的版本,那么您也可以免费使用foreach
- 只在可能的情况下自动并行witheach
。
至于用户是否已准备好承担选择潜在危险的责任,只要他们事先知道什么是安全的,我就会打赌“是”。许多语言迫使你每天做出这个选择(指针,手动内存管理,共享内存并发)。您可能希望使语法不那么模糊(即称之为foreach
),以便人们知道他们注册了什么。
答案 1 :(得分:1)
你的意思是pmap?