入力モジュロ 3 を返す関数を作成しようとしてmod3
いますが、構文が間違っています。double
構文がドキュメントの例と異なる理由がわかりません。
$ jconsole
double =: * & 2
double 1
2
double 2
4
double 3
6
mod3 =: 3 | &
|syntax error
| mod3=: 3|&
(bond) を使用して名詞を動詞にバインドする場合&
、基本的には「固定された」左 (または右) 引数を持つ新しい動詞を作成します。2
乗算は交換可能であるため、 を左または右の引数として修正するかどうかは問題ではないため、次の式は同等です。
double1= *&2 NB. new verb "times by 2"
double2=: 2&* NB. new verb "2 times"
double1 4
8
double2 4
8
ただし、 residule ( ) は交換可能ではないため、必要な結果 (数値を 3 で割った余り) を得るには|
、固定/結合 (3
の左の引数として) を行う必要があります。|
modulo3=: 3&| NB. new verb "remainder after divison by 3"
modulox=: |&3 NB. new verb "remainder of 3 divided by"
modulo3 7
1
modulox 7
3
ポイントは、私が見ているように、二項動詞があり、それに引数を結合すると、単項動詞になるということです。単項動詞の引数は常に ay (J 用語) または右側にあります。
例: ^&3] 4 64 ] は 3 4 を区切り、1 つの数字として表示されないようにします。二項動詞 power から始めました。x を y 乗します。バインドを追加することで、定義どおりに y を 3 乗する単項動詞を作成しました。
3&^ 4
81
これは基本的に同じ例ですが、単項動詞が「3 の y 乗」になっている点が異なります。
二重の例 (+: のようにより簡潔) が示しようとしていたことは、まさに私たちが示していることでした: 結合を使用して単項動詞に変換される二項動詞は、実行に必要な単一の引数を常に正しい引数として取ります。最初の引数が結合されている側の問題。
それが示していないのは、可換でない動詞の場合、元の引数をどちら側にバインドするかが重要であるということです. しかし今、あなたは知っています。:-)
主にプレフィックス言語である J がこの構文を使用する理由はわかりませんが、メーリング リストではこのバージョンを使用するように指示されており、機能します。
mod3 =: 3 & |