Синтаксис J для функций и по модулю

#function #syntax #modulo #j

#функция #синтаксис #modulo #j

Вопрос:

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

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

Ответ №1:

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

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

Однако residule ( | ) не является коммутативным, поэтому в вашем случае вы должны убедиться, что вы исправили / связали (в 3 качестве левого аргумента | , чтобы получить желаемый результат (остаток от числа, деленного на 3).

    modulo3=: 3amp;|    NB. new verb "remainder after divison by 3"
   modulox=: |amp;3    NB. new verb "remainder of 3 divided by"
   modulo3 7
1
   modulox 7
3
 

Комментарии:

1. Если | принимает левый аргумент и правый аргумент, почему infix 3 | 2 работает сам по себе, но при определении функций вы должны использовать postix 3 amp; | ? Это непоследовательно.

2. Честно говоря, я изо всех сил пытаюсь понять, что вы находите неясным. Я подозреваю, что вы ожидаете, что J будет соответствовать некоторым правилам синтаксиса, отличным от J, и это мешает вам понять парадигму J. Нам нужно указать левый аргумент, который мы хотим | использовать, поэтому мы используем конъюнкцию amp; для привязки к нему левого аргумента. Другим методом было бы использовать fork и определить mod3=: 3 | ]

3. Я должен добавить, что причина, по которой я изо всех сил пытаюсь понять вашу точку зрения, заключается в том, что мой опыт работы с терминологией префикса / постфикса / инфикса ограничен. Можете ли вы объяснить, почему 3 amp; | «postfix»? Не могли бы вы утверждать, что с точки зрения конъюнкции amp; оператор является инфиксным?

4. Инфиксный: 1 2 . Префикс: 1 2 . Постфикс: 1 2 . При использовании функции по модулю вне объявления функции используется инфикс: 3 | 4 . Но когда вы используете modulo внутри объявления функции, вы должны использовать либо префикс | amp; 3 , либо постфикс 3 amp; | . Основываясь на описании в Википедии порядка операций APL слева направо, я ожидал, что у J даже не будет инфиксных («диадных») функций, только префиксные функции, как у Lisp.

5. Это правда, что глаголы в предложении J исполняются справа налево. Также бывает, что модификаторы выполняются слева направо. Кроме того, инфикс можно считать центральной формой J, при этом префикс является исключением с одним аргументом для глаголов, а постфикс является исключением с одним аргументом для модификаторов. Поскольку amp; является модификатором, 3amp;| это инфиксная формулировка глагола. Это не постфиксное употребление глагола | , как | параметр to amp; . Весь глагол, который является результатом from 3amp;| , принимает аргумент (например, 7) справа от него.

Ответ №2:

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

 mod3 =: 3 amp; |
 

Ответ №3:

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

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

     3amp;^ 4
81
 

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

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

Чего он не показывает, так это того, что для глаголов, которые не являются коммутативными, имеет значение, с какой стороны вы связываете исходный аргумент. Но теперь вы знаете. 🙂