【发布时间】:2009-06-20 16:56:23
【问题描述】:
Nemerle 等语言支持和弦的概念。我想知道它们的实际用途是什么。
【问题讨论】:
-
我明白你为什么问这个问题。谷歌搜索“c#”、“chord”等真的不是很有帮助!
-
C# 不支持和弦,Polyphonic 版本支持,但我认为该语言不再存在,对吧?
Nemerle 等语言支持和弦的概念。我想知道它们的实际用途是什么。
【问题讨论】:
至少根据 [Wikipedia](http://en.wikipedia.org/wiki/Chord_(concurrency)),该结构似乎也存在于 Cω 语言(以及 Polyphonic C#)中。
chords 的主要用途似乎涉及数据库编程(更具体地说,join calculus),鉴于它是一种并发构造,这并不奇怪。不止这些,恐怕我不知道。
【讨论】:
和弦用于并发。定义在here可用。
您正在寻找的位:
在包括 C# 在内的大多数语言中,类签名中的方法与其实现的代码是双射对应的——对于声明的每个方法,都有一个单独的、不同的定义来说明当该方法被声明时会发生什么。叫。然而,在 Cω 中,主体可能与一组(同步和/或异步)方法相关联。我们把这样的定义称为和弦,一个特定的方法可能出现在几个和弦的标题中。和弦的主体只能在其标头中的所有方法都被调用后才能执行。因此,当调用一个方法时,可能会启用零个、一个或多个和弦:
如果没有启用和弦,则方法 调用已排队。如果方法 是异步的,那么这很简单 涉及添加参数( 消息的内容)到一个队列。 如果方法是同步的,那么 调用线程被阻塞。如果有 是一个启用的和弦,那么 所涉及的调用的论点 匹配出队,任何阻塞 参与比赛的线程是 醒了,身体跑了。当一个 只涉及异步的和弦 方法运行,然后它在一个新的 线。如果有几个和弦 启用然后未指定 其中之一被选中运行。 同样,如果有多个调用 对于排队的特定方法,我们 不指定哪个电话将是 匹配时出队。
【讨论】:
尝试 Nemerle 计算表达式:
https://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/ComputationExpressions/
一些例子:
def upTo (n : int)
{
comp enumerable
{
mutable i = 0;
while (i < n)
{
i ++;
yield i
}
}
}
def manyTimes : IEnumerable [int] =
comp enumerable
{
yieldcomp upTo(2); // 1 2
yield 100; // 100
yieldcomp upTo(3); // 1 2 3
yield 100; // 100
yieldcomp upTo(10); // 1 2 3 .. 10
}
def fn(n)
{
comp async
{
if (n < 20)
returncomp fn(n + 1);
else
return n;
}
}
def f(n1, n2)
{
comp async
{
defcomp n1 = fn(n1);
defcomp n2 = fn(n2);
return $"$n1 $n2";
}
}
private HttpGet(url : string) : Async[string]
{
comp async
{
def req = WebRequest.Create(url);
using (defcomp resp = req.AsyncGetResponse())
using (stream = resp.GetResponseStream())
using (reader = StreamReader(stream))
return reader.ReadToEnd();
}
}
这里有更多例子:(虽然文章是俄语但代码是英语:))http://habrahabr.ru/blogs/programming/108184/
【讨论】: