3
Why does the + function appear to work on tuples?を調べた後、私は次の質問をします。ビット演算子の&(x、y)の呼び出し
Base.:&(1,2)
がなぜ機能するのですか?誰でも説明できますか?&(1,2)
は失敗しますか? 同時に、Base.:|(1,2)
と|(1,2)
の両方が機能します。
Why does the + function appear to work on tuples?を調べた後、私は次の質問をします。ビット演算子の&(x、y)の呼び出し
Base.:&(1,2)
がなぜ機能するのですか?誰でも説明できますか?&(1,2)
は失敗しますか? 同時に、Base.:|(1,2)
と|(1,2)
の両方が機能します。
単精度演算子としての&
は、ccall
構文(ただし、this syntax is deprecated now)で使用されているため、単項演算子としての特殊形式です。したがって、&(1, 2)
はExpr(:&, :(1, 2))
として解析されます。
|
|(1, 2)
が1 | 2
、関数呼び出しとして解析された単項演算子ではありません。+
とは、+(1, 2)
と-(1, 2)
を2つの引数の関数呼び出しとして解析できるように特殊な解析規則を持っています(そうでないと、実行時にエラーとなる1つの引数の関数呼び出しです)。 &
は通常のオペレータではなく特殊なフォームなので、このルールの対象にはなりません。Base.:&
は、演算子として解析されるのではなく、識別子に対する通常のフィールド参照です。したがって、ここではあいまいさはなく、通常の関数呼び出しのように解析されます。同様に、(&)(1, 2)
は通常の関数呼び出しとして解析されるため、(&)
は通常の識別子として解析されるためです。
素晴らしい説明をいただきありがとうございます。 –