【问题标题】:What's the use of chords?和弦有什么用?
【发布时间】:2009-06-20 16:56:23
【问题描述】:

Nemerle 等语言支持和弦的概念。我想知道它们的实际用途是什么。

【问题讨论】:

  • 我明白你为什么问这个问题。谷歌搜索“c#”、“chord”等真的不是很有帮助!
  • C# 不支持和弦,Polyphonic 版本支持,但我认为该语言不再存在,对吧?

标签: c# .net nemerle chord


【解决方案1】:

至少根据 [Wikipedia](http://en.wikipedia.org/wiki/Chord_(concurrency)),该结构似乎也存在于 语言(以及 Polyphonic C#)中。

chords 的主要用途似乎涉及数据库编程(更具体地说,join calculus),鉴于它是一种并发构造,这并不奇怪。不止这些,恐怕我不知道。

【讨论】:

    【解决方案2】:

    和弦用于并发。定义在here可用。

    您正在寻找的位:

    在包括 C# 在内的大多数语言中,类签名中的方法与其实现的代码是双射对应的——对于声明的每个方法,都有一个单独的、不同的定义来说明当该方法被声明时会发生什么。叫。然而,在 Cω 中,主体可能与一组(同步和/或异步)方法相关联。我们把这样的定义称为和弦,一个特定的方法可能出现在几个和弦的标题中。和弦的主体只能在其标头中的所有方法都被调用后才能执行。因此,当调用一个方法时,可能会启用零个、一个或多个和弦:

    如果没有启用和弦,则方法 调用已排队。如果方法 是异步的,那么这很简单 涉及添加参数( 消息的内容)到一个队列。 如果方法是同步的,那么 调用线程被阻塞。如果有 是一个启用的和弦,那么 所涉及的调用的论点 匹配出队,任何阻塞 参与比赛的线程是 醒了,身体跑了。当一个 只涉及异步的和弦 方法运行,然后它在一个新的 线。如果有几个和弦 启用然后未指定 其中之一被选中运行。 同样,如果有多个调用 对于排队的特定方法,我们 不指定哪个电话将是 匹配时出队。

    【讨论】:

      【解决方案3】:

      尝试 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/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-20
        • 1970-01-01
        • 1970-01-01
        • 2011-09-11
        • 2016-06-16
        • 1970-01-01
        相关资源
        最近更新 更多