私は次のようなことを望みます:
>> op : infix-func [self x] [ 2 * x + self ]
>> 3 op 2
== 7
可能です?
私は次のようなことを望みます:
>> op : infix-func [self x] [ 2 * x + self ]
>> 3 op 2
== 7
可能です?
現在不可能です。Rebol 3 では既存の演算子を新しい単語に割り当てることができ、その新しい単語は中置演算子になりますが、Rebol コードから新しい演算子を作成することはできません。
それが機能した場合、おそらく現在のようになりますmake op! [[self x] [2 * x + self]]
部分的には、誰もそれに慣れていないだけの問題だと思います。しかし、現在はオープンソースなので、具体的な実装の提案が真剣に受け止められるかもしれません.
1 つの注意点は、コアの Rebol エバリュエーターが infix を回避することで多くの利益を得ることです。これらの少数のネイティブ中置演算子は、等価性を比較するなどの非常に基本的な処理が「正常」に見えるようにするための緩和策として追加されました。Rebol の「文」が理解するのが難しくならないように、新しい中置演算子を探しているかどうか、本当に欲しいのは方言かどうかを尋ねるのはバランスです...
新しい中置演算子を定義することはできませんが、次の 2 つのオプションがあります。
'+ や '= などの既存の中置演算子を再定義する (強くお勧めしません)
ある種の方言を作成し、その中に必要なコードをラップします例として...
構文: func [ ブロック [ ブロック! ] オプション [ ブロック!] ] [
foreach op select options to-word "operators" [
if find block op [ segment1: copy/part back find block op 2 segment2: reverse copy segment1 replace/all block segment1 segment2 ]
]
ブロックする
]
プラス: func [ ab ] [
リターン: a + b
]
マイナス: func [ ab ] [
リターン: a - b
]
|: func [ ab ] [ print b ]
構文 [
1 プラス 2 を出力
5 マイナス 7 を出力
1 | "終わり"
] [
演算子 [ プラス マイナス | ]
]
が実行され、以下がコンソールに出力されます。
3
-2
終わり
このようなものを使用して、新しい 3 次演算子や新しいフロー制御構造を定義することさえ簡単になります。このサンプルでは、コードのあるシリーズに沿って移動し、順序を入れ替えるだけです (つまり、「1 プラス 2」を効果的に「プラス 1 2」にします)。適切な方言 (DSL) は、構文に近いものを提供するために parse を使用する可能性があります。