问题标签 [infix-operator]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
155 浏览

macros - Common Lisp Read Macro for "lazy infix or" 来解构关键字

我有一个 Common Lisp 阅读器宏来解析“或”关系的惰性/延迟声明,使用由管道字符(“|”)分隔的中缀语法以及标准列表括号和关键字文字。考虑 (:a :b|:c) 形式——它表示一个 2 部分元组,其中第一个元素肯定是 :a,第二个元素是 :b 或 :c。例如,可以推断出整个元组的有效形式是 (:a :b) 或 (:a :c)。

我已经有函数封装的逻辑来解构这些元组列表形式在读取宏之后。但是在阅读时,我需要解析像 :a|:b|:c 这样的表单,并用移除的管道对其进行标记,例如 (:lazy-or :a :b :c)。中缀语法的使用纯粹是为了面向读者的形式;中缀形式是短暂的,并在读取阶段立即被丢弃,以支持使用 :lazy-or 标记的等效合法 lisp 形式。

所以我做了一个 read 宏,它几乎可以按我的意愿工作,但目前需要在第一个 or-form 关键字元素之前使用一个额外的管道作为一种阅读器符号(我希望这不是必需的根本),并且它目前无法使用嵌套括号或拼接符号来推断类似的形式作为等效(就像在算术中一样,2+(3*4)是相同的操作顺序,等效形式, as 2+3*4)。

宏(源自“斜线阅读器”:http ://www.lispworks.com/documentation/HyperSpec/Body/f_rd_rd.htm ):

预期目标是在读取时应用/替换此重写规则: (macroexpand '(:a (:b | :c))) -> (:a (:lazy-or :b :c)) 或者,括号中未包含的变体形式相同(一种默认的操作顺序;空格不会产生影响): (macroexpand '(:a :b|:c)) -> (:a (: lazy-or :b :c)) (macroexpand '(:a :b | :c)) -> (:a (:lazy-or :b :c)) 嵌套表单应该直观地递归渲染: (macroexpand ' (:a (:b | (:c | :d)))) -> (:a (:lazy-or :b (:lazy-or :c :d)))

请注意,在基本形式的预期重写规则中 -- (macroexpand '(:a (:b | :c))) -> (:a (:lazy-or :b :c)) -- :a 不会以 or 形式加入,因为它没有中缀管道运算符来加入它;它以一种元组的形式与 or-form 的结果一起存在。如前所述,在进一步评估惰性形式时,可以想象,元组可能会产生 (:a :b) 或 (:a :c) - 以上暗示两者都是稍后解构的有效形式。

我非常接近。

问题是我不能完全理解,只有以下(使用上面的宏): (macroexpand '(:a |:b|:c )) -> (:A (:LAZY-OR :B :C) ) (macroexpand '(:a :b |:d|:e|:f|:g)) -> (:A :B '(:LAZY-OR :D :E :F :G)) 它实际上做的最多我打算这样做,它是一个功能性的基本解决方案:稍微修改执行规则以允许在读取时在中缀或表单的开头有一个额外的管道,而无需将表单连接到该管道的左侧,因此它可以使 :b 到 :c (第一种形式)或 :d 到 :g (第二种形式)成为 :lazy-or 形式列出的有效案例,并使该内部列表本身成为外部列表的成员/元组与非变量值 :a 和 :b 并排。它接近我想要的: (macroexpand '(:a :b :d|:e|:f|:g)) -> 应该,不 -> (:A :B '(:LAZY-OR :D :E :F :

有 3 个错误,按重要性排序:

  1. 需要额外的“前缀”管道

    额外的开口管道,在每个被读取的或形式开始时,我不想这样做。我想切割该管道以保持清洁和我自己的可读性偏好,并且仅在该读取宏的完全中缀位置使用该管道。

  2. 递归解析时向嵌套表单添加了额外的括号

    它为嵌套表单添加了额外的括号,尽管它可以很好地递归处理嵌套表单。

  3. 空白不被任意接受

    它不接受管道之间的空格。我尝试使用 read-preserving-whitespace 而不是 read,在这里无济于事。它应该接受管道和关键字形式之间的空格,就好像它们不存在一样,因为形式:a|:b:a | :b是等价的。

read 宏主要封装了工作逻辑,擅长递归和嵌套形式: (macroexpand '(:a |(|:b|:c)|(|:e|:f))) -> yield -> (:A (:LAZY-OR ((:LAZY-OR :B :C)) ((:LAZY-OR :E :F))))
;(几乎完美,完全按照预期递归扩展,唯一的问题除了需要开头的管道之外的形式是在最终的 :lazy-or 形式周围生成的双括号)。这样就可以从这种形式产生相同的结果(当前是“不平衡”读取括号错误): (macroexpand '(:a (:b | :c) | (:e | :f))) -> 应该,确实不屈服 -> (:A (:LAZY-OR (:LAZY-OR :B :C) (:LAZY-OR :E :F)))

除了 read 宏添加的额外括号,以及它无法在中缀形式中允许间距之外,真正关键的错误是无法在不包括第一个非中缀管道的情况下将 or-form 编写为中缀管道形式(附带前缀)。我真的碰到了一堵砖墙,试图匹配流,而不需要使用第一个管道字符作为读取解析器的一种标志。也许对“peek”函数之一的额外调用或两次调用会给我一个更专业的匹配形式,但我无法弄清楚如何解析它。

我考虑围绕现有的综合解决方案构建它,例如 NKF(“definfix”宏,https: //www.cliki.net/infix )和 CMU 中缀(https://github.com/rigetti/cmu-infix/blob /master/src/cmu-infix.lisp),但由于它们是更通用和更大的代码库,我认为我不需要为更多类型的表单/运算符重用中缀逻辑,仅此一个。从我在一个相当小的宏上的接近程度来看,我肯定更喜欢用一个小而简洁的解决方案来解决它,只要它仍然是递归的并且不容易出错。

任何关于为此目的更有效地使用读取宏的观点都将不胜感激。

0 投票
2 回答
91 浏览

implicit - 如何为中缀运算符指定隐式参数?

假设我有一个操作员

(其中Tensor需要一个Vect和一个类型,但这在这里并不重要)。如果我想指定tail,我知道我可以a @@ b通过变成像这样@@的函数来添加(@@)

但这在某种程度上违背了它被中缀的意义。什么是惯用语?

0 投票
0 回答
20 浏览

javascript - 前一个表达式的后缀结果

将以下表达式从中缀转换为后缀表示法: x+y^(zp*t)-r/t • 如果 x=5, y= 1, z=2, p=1 ,t= 则计算前一个表达式的后缀结果3 , r=12

0 投票
2 回答
51 浏览

swift - 如何在协议扩展中为自定义中缀运算符实现默认方法

我正在尝试将自定义比较中缀运算符实现==^为标准相等运算符的精简版本==

我的应用程序主要是面向协议的,因此我试图static func ==^在协议扩展中实现默认方法。但是,当我让我的类符合协议时,我遇到了一个Type 'MySourceNode' does not conform to protocol 'SourceNodeType'错误,Xcode 让我添加static func ==^协议存根。

我的问题是,如何在协议扩展中正确编写默认实现?

我试图在 SO 上找到答案,但其中大多数都比较老,并且只讨论在协议扩展之外定义的通用方法。但这在我的情况下似乎不起作用。

这是一个游乐场文件,其中包含我的协议的简化版本。代码后有一些背景信息。如果有不清楚的地方,请在评论中告诉我,我会相应地更新我的问题。

解释这个自定义中缀运算符背后的原因。我需要它,因为我经常将 SpriteKit 的 SKShapeNodes 的子类相互比较。但是我不希望比较类中的每个变量,例如可访问性标签或名称,因为我在将节点添加到场景时更改了这些值,这部分是在比较之后。

0 投票
1 回答
63 浏览

scala - “???”是什么意思 代表 Scala 语言?

实际上,我有几个关于这个代码片段的问题:

  1. 做 '???' 导致这个异常?
  2. 可以分配什么而不是'???' ?
  3. '???' 是什么意思?代表?

堆栈跟踪:

0 投票
1 回答
102 浏览

swift - 是否可以以相同的方式(具有相同的命名)使用 kotlin 中缀函数和 swift 中缀运算符?

我在 kotlin 中有一个中缀函数,可以这样调用:

现在我正在尝试快速做同样的事情。我已经认为我可以像下面那样做,但这似乎不起作用:

错误:'eq' 被认为是标识符,而不是运算符中缀运算符 eq

有没有办法让这个工作?

0 投票
1 回答
184 浏览

methods - 类似方法的语法中的 Raku 中缀运算符

在 Raku 中,中运算符可以像函数一样使用,例如:

前缀运算符可以与类似方法的语法(methodop)一起使用:

所以,(相当学术的)问题是,中运算符也可以以类似方法的方式使用,比如1.:<+>(2)(这是错误的)吗?

咖喱

…那是函数(某种)定义和调用,不是方法调用,也不是类似方法的语法。

自定义方法

…但是+不能使用名称,这也不是没有附加函数定义的直接运算符用法。

0 投票
1 回答
40 浏览

r - R:(中缀)运算符的两个定义之间的冲突:如何指定包?

在 R 中,只要两个包定义了相同的函数,就很容易指定使用哪个包pkg::foo。但是当冲突的函数是中运算符时,你怎么办,即使用定义%%

例如,两者ggplot2crayon定义%+%. 有没有一种方法我可以默认使用ggplot2's %+%,但在给定的行中使用crayon's %+%?只是crayon::`%+%` 调用正确的函数(注意反引号),但不再用作中缀运算符!?我可以crayon::`%+%`(a, b),它有效,但它不是作为操作员的功能!

代码:

0 投票
0 回答
22 浏览

c++11 - 使用堆栈的中缀到后缀中的 SIGSEGV 错误

我尝试将 if 条件设置为 while 循环以从括号中的堆栈中删除多个运算符时 (f+g/h) 这里输出应该是 (fgh/+) 但我无法使用 while 循环运行代码我的输出是由于 if 条件而出现(fgh/),我如何在没有 SIGSEGV 的情况下放置 while 循环,我得到运行时错误 SIGSEGV?

0 投票
0 回答
83 浏览

c++ - 在 C++17 中为整数实现 NaN

为类 int 类型实现 NaN 算术的 C++17 惯用方法是什么?特别是,当任一参数为 NaN 时,加(或减)应准确得出 NaN。(该标准明确地将 int 从这种默认行为中排除。甚至quiet_NaN返回,对于日常使用来说太危险了。)

我的出发点是一个对我的应用程序来说足够超出范围的值,

在 C 中,您可以将每个替换x + ymy_add(x, y)针对 my_NaN 测试 x 和 y 的 a。丑陋的。在 Ruby 中,您可以像往常一样愉快地
使用 对 Integer 类进行猴子补丁。 C++17 能否接近 Ruby 让您保留传统中缀表示法的方式?def +(other) self==my_NaN ? my_NaN : ...x + y


除了一个简单的 int 之外,我还希望为 std::chrono::duration<int64_t, std::micro>相应的time_point. 我对覆盖所有可以添加和减去的不同方式感到不寒而栗。