3

私は次のようなことを望みます:

>> op : infix-func [self x] [ 2 * x + self ]
>> 3 op 2
== 7

可能です?

4

2 に答える 2

3

現在不可能です。Rebol 3 では既存の演算子を新しい単語に割り当てることができ、その新しい単語は中置演算子になりますが、Rebol コードから新しい演算子を作成することはできません。

それが機能した場合、おそらく現在のようになりますmake op! [[self x] [2 * x + self]]

部分的には、誰もそれに慣れていないだけの問題だと思います。しかし、現在はオープンソースなので、具体的な実装の提案が真剣に受け止められるかもしれません.

1 つの注意点は、コアの Rebol エバリュエーターが infix を回避することで多くの利益を得ることです。これらの少数のネイティブ中置演算子は、等価性を比較するなどの非常に基本的な処理が「正常」に見えるようにするための緩和策として追加されました。Rebol の「文」が理解するのが難しくならないように、新しい中置演算子を探しているかどうか、本当に欲しいのは方言かどうかを尋ねるのはバランスです...

于 2014-04-02T17:48:52.307 に答える
1

新しい中置演算子を定義することはできませんが、次の 2 つのオプションがあります。

  1. '+ や '= などの既存の中置演算子を再定義する (強くお勧めしません)

  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 を使用する可能性があります。

于 2017-01-28T01:14:07.153 に答える