【问题标题】:In what language is there a "guard" keyword or concept?什么语言有“守卫”关键字或概念?
【发布时间】:2010-01-30 15:30:32
【问题描述】:

我最近试图理解一个 C++ 程序,该程序是由我认为有函数式编程背景的人编写的:例如,他声明了一个他广泛使用的 closure 类,它在某种程度上起到了作用类似于函数式编程中所谓的闭包。另一个职业叫做guard,但我还没有完全弄清楚它有什么用处。它似乎附加了某种清理功能。

我看到的唯一一种叫做 guard 概念的语言是 Erlang,但它与我找到的代码看起来并不相似。 C++ 代码的作者可能暗示过这种概念存在于哪些其他语言中?

【问题讨论】:

  • 你能举个例子吗?
  • 在 C++ 中,guard variable 是一个线程安全的布尔值,用于确保静态变量只被初始化一次(在概念上类似于 Singleton),这与“guards”完全不同" 在类似于 条件 的函数式语言中。但由于这个名称来自自定义类,因此很难分辨它指的是哪个函数。
  • AraK:抱歉,我不能发布任何代码。有一件事我可以说它显然与在 Erlang 或 Haskell 中指定条件的机制无关。
  • 这个问题没有代码也没用

标签: c++ class nomenclature


【解决方案1】:

在我看来,他好像在使用 RAII。
类构造函数/析构函数用于在异常安全上下文中对称地处理某种形式的资源分配/释放(Java 程序员最终会调用 {},因为析构函数肯定会被调用。)。

这是一个非常常见的 C++ 习语,在现代 C++ 中被广泛使用。

代码是这样的吗:

void Plop()
{
     Guard   guard(lock);
     // Do lots of stuff
}

这里的守卫在构造函数中锁定锁并在析构函数中解锁。

【讨论】:

  • +1 我怀疑这是真正的正确答案。功能性的东西可能是红鲱鱼。
  • 如果你的意思是“资源分配是初始化”,你几乎肯定是对的。谢谢!不过,我仍然不太确定 guard 指的是什么。
  • 防止异常导致问题!
【解决方案2】:

several functional languages 中使用术语“守卫”的方式与在 Erlang 中使用的方式相同,但这种用法似乎不符合您的描述。如果没有看到 C++ 代码,很难真正知道它的意图。

根据您的描述猜测它实现了类似于 Haskell 的 bracket 的东西,它基本上确保在包装函数退出时释放一些资源,即使发生异常也是如此。在 Python 中,人们会为此使用 finally,而在 C++ 中,您通常在堆栈上对象的析构函数中拥有清理代码。

【讨论】:

    【解决方案3】:

    一般来说,守卫只是一个简单的构造,需要评估为真才能沿着某些路径继续执行。这个或类似的东西存在于所有有用的图灵完备的编程语言中,但可能是如此基本,以至于通常不会单独命名为一个实体。这是 Haskell 中的一个简单示例:

    f x
     | x < 0 = -x
     | otherwise = x
    

    这相当于绝对值函数:如果一个数字是负数,则取反以产生它的正数;否则,返回传入的相同值。这里有两个守卫:x &lt; 0,当 x 小于零时为真,otherwise,始终为真。

    【讨论】:

      【解决方案4】:

      Haskell 的 Control.Monad 模块有 guard:

      guard :: MonadPlus m =&gt; Bool -&gt; m ()
      如果bTrue,则guard breturn (),如果bFalse,则mzero

      例如,要计算每条腿不超过 25 条的毕达哥拉斯三元组,您可以使用

      triples = do
        a <- [1..25]
        b <- [a..25]
        c <- [b..25]
        guard (p a b c)
        return (a,b,c)
        where
          p a b c = a*a + b*b == c*c
      

      有关发生了什么的解释,请参阅我的博文A programmable semicolon explained

      【讨论】:

        【解决方案5】:

        计算机科学中的守卫通常指的是布尔表达式,表示循环构造应该继续。例如(请原谅双关语)

        for (int i = 0; i < N; ++i)
          /* stuff */
        

        这里,i &lt; N 是守卫。

        如果没有更多信息,很难更彻底地回答您的问题。

        【讨论】:

          猜你喜欢
          • 2011-02-04
          • 2017-11-27
          • 1970-01-01
          • 1970-01-01
          • 2011-06-08
          • 2016-04-26
          • 1970-01-01
          • 2015-01-18
          • 1970-01-01
          相关资源
          最近更新 更多