#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. Если
|
принимает левый аргумент и правый аргумент, почему infix3 | 2
работает сам по себе, но при определении функций вы должны использовать postix3 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;|
это инфиксная формулировка глагола. Это не постфиксное употребление глагола|
, как|
параметр toamp;
. Весь глагол, который является результатом from3amp;|
, принимает аргумент (например, 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».
Двойной пример (более краткий, как 🙂 пытался показать именно то, что мы показываем: что двоичный глагол, который преобразуется в монадический глагол со связью, всегда принимает единственный аргумент, который ему нужно выполнить, в качестве правильного аргумента, независимо от того, с какой стороны связан первый аргумент.
Чего он не показывает, так это того, что для глаголов, которые не являются коммутативными, имеет значение, с какой стороны вы связываете исходный аргумент. Но теперь вы знаете. 🙂