【问题标题】:REBOL path operator vs division ambiguityREBOL 路径运算符与除法歧义
【发布时间】:2011-03-07 12:48:43
【问题描述】:

我开始研究 REBOL 只是为了好玩,作为编程语言的粉丝,我真的很喜欢看到新的想法,甚至只是替代语法。 REBOL 肯定充满了这些。我注意到的一件事是使用“/”作为路径运算符,它可以与“。”类似地使用。大多数面向对象编程语言中的运算符。我没有广泛地使用 REBOL 进行编程,只是查看了一些示例并阅读了一些文档,但我不清楚为什么 '/' 运算符没有歧义。

x: 4
y: 2
result: x/y

在我的示例中,这应该是除法,但如果 x 是一个对象或函数细化,它似乎也可以很容易地成为路径运算符。 REBOL 如何处理歧义?这只是重载运算符和类型系统的问题,所以它直到运行时才知道?还是我在语法中遗漏了什么,真的有区别?

更新找到一段不错的示例代码:

sp: to-integer (100 * 2 * length? buf) / d/3 / 1024 / 1024

似乎算术除法需要空格,而路径运算符不需要空格。是这样吗?

【问题讨论】:

  • “我真的很喜欢看到新的想法,甚至只是替代语法。REBOL 肯定充满了这些。” - 这里说的是实话。 :-) 如果您仍然对该主题感兴趣,请随时加入我们的StackOverflow Rebol chat room,它已作为开源发布!

标签: parsing rebol ambiguity


【解决方案1】:

从句法的角度来看,这个问题值得回答。事实上,在 Rebol 中并没有“路径运算符”。 x/y 是一个称为路径的句法元素。与独立的/(由空格分隔)相反,它不是路径,而是一个单词(通常被解释为除法运算符)。在 Rebol 中,您可以像这样检查句法元素:

length? code: [x/y x / y] ; == 4
type? first code ; == path!
type? second code

【讨论】:

    【解决方案2】:

    代码指南说:

    空白通常用于分隔(用于分隔符号)。

    这一点尤为重要因为单词可能包含 + 和 - 等字符。

    http://www.rebol.com/r3/docs/guide/code-syntax.html

    成为 REBOler 的一项后天技能是掌握在其他语言通常不需要的表达式中插入空格的窍门 :)

    【讨论】:

    • 啊,谢谢。我在我正在查看的教程中没有看到它,但是是的,这显然是正在发生的事情。
    • 出于好奇,您觉得这很烦人,还是没什么大不了的?
    • 我不完全相信宽松的单词命名规则是表达式中强制额外空格的一个很好的权衡......但它很容易记住。
    【解决方案3】:

    Rebol 中通常需要空格,但“特殊”字符也有例外,例如分隔系列。例如:

    • [a b c][ a b c ] 相同
    • (a b c)( a b c ) 相同
    • [a b c]def[a b c] def 相同

    type?quoteprobe 是一些相当强大的语法元素自省工具。引号操作符阻止解释器给事物赋予行为。因此,如果您尝试以下操作:

    >> data: [x [y 10]]
    >> type? data/x/y
    >> probe data/x/y
    

    代码的“实时”特性将挖掘路径并为您提供integer!10。但是如果你使用引号:

    >> data: [x [y 10]]
    >> type? quote data/x/y
    >> probe quote data/x/y
    

    然后你会得到一个path!,它的值只是data/x/y,它永远不会被评估。

    在内部表示中,PATH!与 BLOCK 非常相似!或PAREN!。它只是具有这种特殊的独特词汇类型,因此可以区别对待。尽管您已经注意到它可以通过从对象或系列中挑选成员来表现得像一个“点”,但这只是 DO 方言使用它的方式。您可以发明自己的想法,假设您制作了“russell”命令:

    russell [
        x: 10
        y: 20
        z: 30
        x/y/z
        (
            print x
            print y
            print z
        )
    ]
    

    想象一下,在我的奇特示例中,这会输出 301020...因为 russell 函数所做的是以这样一种方式评估其块,即路径被视为移位指令价值观。所以x/y/z 表示 x=>y、y=>z 和 z=>x。然后括号中的任何代码都以 DO 方言运行。作业正常处理。

    当您想创作一段有趣的新即兴演奏来表达自己时,Rebol 会处理很多繁琐的工作。因此,例如,括号可以保证匹配到paren!。您不必自己去寻找所有这些,您只需从所有这些不同类型的构建块中构建您的方言......并与现有行为挂钩(例如用于数学和一般计算等基础知识的 DO 方言,以及令人费解的 PARSE 方言,用于一些相当惊人的模式匹配肌肉)。

    但是说到“所有这些不同的类型”,斜线还有另一种奇怪的情况可以创建另一种类型:

    >> type? quote /foo
    

    这被称为refinement!,当你开始一个带有斜线的词法元素时会发生这种情况。您将看到它在 DO 方言中用于调用函数的可选参数集。但再一次,它只是零件盒中的另一个象征性乐高积木。你可以用完全不同的方言赋予它意义......

    【讨论】:

      【解决方案4】:

      虽然我没有找到任何书面明确的说明,但我确实发现 +、-、* 和其他字符是单词中的有效字符,因此显然它需要一个空格。

      x*y
      

      是一个有效的标识符

      x * y
      

      执行乘法。看起来路径运算符只是这种情况的另一种情况。

      【讨论】:

        猜你喜欢
        • 2010-09-27
        • 1970-01-01
        • 1970-01-01
        • 2021-02-05
        • 2015-08-28
        • 2021-11-14
        • 2021-05-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多