Правила синтаксического анализа для / (уменьшить) в APL при наличии n-мудрого уменьшения? - PullRequest
1 голос
/ 11 марта 2020

Я думал, что правила синтаксического анализа APL были просты: при просмотре термина ⍺ f ⍵ функция f получает аргументы ⍺, ⍵. Действительно, для оператора редукции / в APL мы можем подумать о:

+/(1 2 3 4) ⍝ REDUCE(+, (1 2 3))
10

Однако этот лог c выбрасывается в окно в случае:

2+/(1 2 3 4) ⍝ REDUCE(2, +, (1, 2, 3)) ?
(3 5 7)

То есть, кажется, что для анализа этого нужно искать два позади в промежуточном дереве анализа - один сзади, чтобы получить оператор +, и два сзади, чтобы получить число 2.

Это значительно усложняет мою ментальную модель того, как читать и анализировать выражения APL - я что-то здесь упускаю? В качестве альтернативы, если это действительно так, то есть ли другие операторы APL, которые "смотрят за" более чем одним подвыражением?

1 Ответ

2 голосов
/ 11 марта 2020

Как введение в APL, простые правила о функциях и массивах являются адекватными, но как только вы добавите операторы (и особенно операторы dyadi c) в микс, все станет немного сложнее. Хотя правила функций / массивов все еще применяются, теперь функция может быть выведена с использованием одного или нескольких операторов. Фактически, вы можете в конечном итоге посмотреть далеко налево, чтобы выяснить, где «начинается» функция.

Рассмотрим, например, функцию *∘*∘*∘*, f (a, b) = a e e e b , в контексте 2*∘*∘*∘*3:

3 это наш массив

* возможно, мы применим эту функцию монадически к 3, но это зависит…

Нет: это оператор dyadi c, который "захватывает" * справа от него, чтобы получить новую функцию

* возможно, это левый операнд , но это зависит от…

Нет: это дядя c оператор, который «захватывает» * справа от него для получения новой функции

* возможно, это левый операнд , но это зависит от…

et c.

Так я на самом деле разбираю APL в своей голове. Однако более точный общий подход использует таблицу сильных связей в соответствии с документацией и реализацией модели

...