【问题标题】:Why guards are called 'guards'?为什么守卫被称为“守卫”?
【发布时间】:2017-11-27 07:33:53
【问题描述】:

有谁知道名为guards的结构名称的由来吗?

func x
    | cond1 -> expr1  
    ...
    | condN -> exprN

Wikipedia 文章 Guard_(computer_science) 提供了一些历史观点,但没有解释名称的来源(它只是提到 SASL 是最早使用该名称的人之一)。

到目前为止,我发现了对 Edsger Dijkstra 和他的 Guarded Command Language 的引用。他是第一个使用“守卫”这个词的吗?

【问题讨论】:

  • 一个守卫决定谁可以进来,谁可以出去。所以条件决定表达式是否“触发”。
  • 接近投票:这个问题(“Dijkstra 是第一个使用‘守卫’这个词的人吗?”)既不宽泛也不基于意见。我不确定计算历史问题是否是主题。我倾向于不这样做,但无论如何,这个问题显然不是关于通用计算硬件和软件的(并且在 SuperUser 上可能会比这里甚至更多离题)。所以我眯着眼睛看目前为止存在的所有接近投票。
  • 不是 SASL,KRC。
  • 守卫与普通条件没有太大区别。这些已经在(基本上被忽略的)Plankalkül 中(尽管维基百科说它影响了 Algol 58)。

标签: haskell functional-programming guard-statement


【解决方案1】:

我认为询问术语的来源是没有意义的。 (例如,为什么 Haskell 有 'types' 和 'kinds',而 math 有 'sorts'?)维基百科的文章很好。

右边的写作风格确实反映了数学(维基百科文章有一个例子)。这可能是影响 Dijkstra 的原因。 Strachey 1967 年的“基本概念”中也有相同的数学风格。 (他不使用“守卫”。)

@Will Ness guards are not much different from plain conditionals 是不对的。所以最好有一个与“条件”不同的词。守卫出现在模式匹配之后:

case x of
  (Maybe x') | x' > 0 -> ...
  Nothing {- x' not in scope here -} -> ...

在case分支中:先匹配模式,然后绑定变量;然后使用变量应用守卫。

你可以将这个想法扩展到类型级别https://github.com/AntC2/ghc-proposals/blob/instance-apartness-guards/proposals/0000-instance-apartness-guards.rst

【讨论】:

  • 我认为声称某人的好奇心毫无意义是没有意义的
  • (cond ((even? 2) => (lambda (b) ...)) (else ... ;|b is not in scope here|; ...))。波塔托,波塔托。 :) “差别不大” =/= “完全一样”。 --- 从足够远的地方看,一切都像其他一切。 (“嗯,那些基于强子的物体彼此之间并没有太大的不同”,一个基于能量的生命体看着人和一棵树说......)
  • (顺便说一句,@ ping 不适用于帖子正文,只能来自 cmets)
【解决方案2】:

是的,这个词来自 Dijkstra。 Guarded commands, non-determinacy and formal derivation of programs (CACM 1975)

具有讽刺意味的是,Wikipedia article Guard (computer science) 说“Guard 代码提供了子程序的早期退出,并且是结构化编程的常用偏差”,缺乏对守卫和结构化编程的基本理解,因为该术语变得重要是因为Dijkstra 的守卫是结构化编程的基础性和有影响力的贡献。

【讨论】:

    猜你喜欢
    • 2016-04-26
    • 1970-01-01
    • 2016-07-30
    • 2013-03-31
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    相关资源
    最近更新 更多