J синтаксис для функций и по модулю - PullRequest
3 голосов
/ 28 октября 2011

Я пытаюсь создать функцию mod3, которая возвращает вход по модулю три, но мой синтаксис неверен. Я не понимаю, почему синтаксис будет отличаться от примера double в документации.

$ jconsole
   double =: * & 2
   double 1
2
   double 2
4
   double 3
6
   mod3 =: 3 | &
|syntax error
|   mod3=:    3|&

Ответы [ 3 ]

5 голосов
/ 29 октября 2011

Когда & (связка) используется для привязки существительного к глаголу, это по существу создает новый глагол с «фиксированным» левым (или правым) аргументом. Поскольку умножение является коммутативным, не имеет значения, фиксируете ли вы 2 в качестве левого или правого аргумента, поэтому следующие значения эквивалентны:

   double1= *&2     NB. new verb "times by 2"
   double2=: 2&*    NB. new verb "2 times"
   double1 4
8
   double2 4
8

Однако остаток (|) не является коммутативным, поэтому в вашем случае вы должны убедиться, что вы исправили / связали (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
0 голосов
/ 01 ноября 2011

Суть, на мой взгляд, состоит в том, что когда у вас есть диадический глагол, и вы связываете с ним аргумент, он становится монадическим глаголом. Монадические глаголы всегда имеют аргумент как у (терминология J) или справа.

Пример: ^ & 3] 4 64 ] Разделяет 3 4 так, чтобы они не рассматривались как одно число. Я начал с диадического глагола, силы, возьмите х в степень у. Добавив связывание, я создал монадический глагол, который по определению переводит y в третью степень.

    3&^ 4
81

Это, по сути, тот же пример, за исключением того, что теперь мой монадический глагол "возьми 3 в силу у".

То, что пытался показать двойной пример (более лаконичный как + :), было именно тем, что мы показываем: что диадический глагол, который преобразуется в монадический глагол со связью, всегда принимает единственный аргумент, который ему необходимо выполнить, как право аргумент, независимо от того, с какой стороны связан первый аргумент.

То, что он не показывает, это то, что для глаголов, которые не являются коммутативными, важно, к какой стороне вы привязываете исходный аргумент. Но теперь ты знаешь. : -)

0 голосов
/ 28 октября 2011

Я не уверен, почему J, язык с преобладающим префиксом, использует этот синтаксис, но в списке рассылки сказано использовать эту версию, и она работает.

mod3 =: 3 & |
...