Вопрос

Я использую J в течение нескольких месяцев, и я нахожу, что чтение незнакомого кода (например, я не писал сам) является одним из самых сложных аспектов языка, особенно когда он в молчании. Через некоторое время я придумал эту стратегию:

1) Скопировать сегмент кода в документ Word

2) Возьмите каждого оператора из (1) и поместите его на отдельную линию, чтобы он читал вертикально

3) Замените каждого оператора на устное описание на странице словаря

4) Сделайте грубый перевод из J Syntax в английскую грамматику

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

6) Напишите описание того, что должен делать каждый компонент из (5) в простой английской прозе

7) Напишите описание того, что должна делать вся программа, на основе (6)

8) Напишите объяснение того, почему можно сказать, что код из (1) представляет концепцию дизайна из (7).

Хотя я многому учусь из этого процесса, я считаю, что он довольно трудный и трудоемкий-особенно если кто-то разработал свою программу, используя концепцию, с которой я никогда не сталкивался раньше. Поэтому мне интересно: есть ли у других людей в сообществе J любимые способы выяснить неясный код? Если да, то каковы преимущества и недостатки этих методов?

РЕДАКТИРОВАТЬ:

Примером того кода, который мне нужно было бы сломать, является следующее:

binconv =: +/@ ((|.@(2^i.@#@])) * ]) @ ((3&#.)^:_1)

Я написал это сам, поэтому я знаю, что он требует численного ввода, переосмысливает его как тройной массив и интерпретирует результат как представление числа в базе-2 с максимум одним дублированием. (например, binconv 5 = (3^1)+2*(3^0) -> 1 2 -> (2^1)+2*(2^0) = 4.), но если я наткнулся на него без Любая предыдущая история или документация, выяснив, что это то, что он делает, было бы нетривиальным упражнением.

Это было полезно?

Решение

Попробуйте сначала разбить глагол на его компоненты, а затем посмотрите, что они делают. И вместо того, чтобы всегда ссылаться на словарь, вы можете просто попробовать компонент на данные, чтобы увидеть, что он делает, и посмотреть, сможете ли вы это выяснить. Чтобы увидеть структуру глагола, он помогает узнать, на какие части речи вы смотрите, и как идентифицировать основные конструкции, такие как вилки (и, конечно, в более крупных молчаливых конструкциях, отделенных в скобках). Просто ввести глагол в окно IJX и нажатие ввода также сломает структуру и, вероятно, поможет.

Рассмотрим следующий простой пример: <.@-:@#{/:~

я знаю это <. -: # { и /: все глаголы, ~ наречие, и @ является соединением (см. Части речевой ссылки в словаре). Поэтому я вижу, что это вилочная структура с левым глаголом <.@-:@# , правый глагол /:~ и дьяда { Отказ Это требует некоторой практики, чтобы увидеть, но есть более простой способ, позвольте J показать вам структуру, введя ее в окно IJX и нажав Enter:

   <.@-:@#{/:~
+---------------+-+------+
|+---------+-+-+|{|+--+-+|
||+--+-+--+|@|#|| ||/:|~||
|||<.|@|-:|| | || |+--+-+|
||+--+-+--+| | || |      |
|+---------+-+-+| |      |
+---------------+-+------+

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

   10?20
15 10 18 7 17 12 19 16 4 2
   /:~ 10?20
1 4 6 7 8 10 11 15 17 19
   <.@-:@# 10?20
5

Вы можете сломать их дальше и экспериментировать по мере необходимости, чтобы выяснить их (этот маленький пример - медиана).

J упаковывает много кода в несколько символов, и большие молчаливые глаголы могут выглядеть очень пугающими, даже для опытных пользователей. Экспериментирование будет быстрее, чем ваш метод документирования, и вы действительно можете многое узнать о J, пытаясь разбить большие сложные глаголы. Я думаю, что я бы порекомендовал сосредоточиться на попытке увидеть грамматическую структуру, а затем выяснить части, создавая их шаг за шагом (так как вы в конечном итоге будете писать молчаливые глаголы).

Другие советы

Просто хотел добавить к Ответ Джордана : Если у вас нет расстояния коробки, вы можете отформатировать вещи таким образом явно с 5!:2

   f =. <.@-:@#{/:~
   5!:2 < 'f'
┌───────────────┬─┬──────┐
│┌─────────┬─┬─┐│{│┌──┬─┐│
││┌──┬─┬──┐│@│#││ ││/:│~││
│││<.│@│-:││ │ ││ │└──┴─┘│
││└──┴─┴──┘│ │ ││ │      │
│└─────────┴─┴─┘│ │      │
└───────────────┴─┴──────┘

Есть также дисплей дерева:

   5!:4 <'f'
              ┌─ <.
        ┌─ @ ─┴─ -:
  ┌─ @ ─┴─ #       
──┼─ {             
  └─ ~ ─── /:     

Смотрите страницу словаря для 5!: Представительство а также 9!: Глобальные параметры Для изменения по умолчанию.

Кроме того, для того, что это стоит, мой собственный подход к чтению J заключался в том, чтобы перерисовать выражение вручную, создать его справа налево и просмотреть кусочки по ходу дела и использование идентификационных функций для формирования временных поездов, когда мне нужно к.

Так, например:

   /:~ i.5
0 1 2 3 4
   NB. That didn't tell me anything
   /:~ 'hello'
ehllo
   NB. Okay, so it sorts. Let's try it as a train:
   [ { /:~ 'hello'
┌─────┐
│ehllo│
└─────┘
   NB. Whoops. I meant a train:
   ([ { /:~) 'hello'
|domain error
|       ([{/:~)'hello'
   NB. Not helpful, but the dictionary says
   NB. "{" ("From") wants a number on the left.
   (0: { /:~) 'hello'
e
   (1: { /:~) 'hello'
h
   NB. Okay, it's selecting an item from the sorted list.
   NB. So f is taking the ( <. @ -: @ # )th item, whatever that means...
   <. -: # 'hello'
2
   NB. ??!?....No idea. Let's look up the words in the dictionary.
   NB. Okay, so it's the floor (<.) of half (-:) the length (#)
   NB. So the whole phrase selects an item halfway through the list.
   NB. Let's test to make sure.
   f 'radar' NB. should return 'd'
d
   NB. Yay!

Приложение:

   NB. just to be clear:
   f 'drara' NB. should also return 'd' because it sorts first
d

(Я ставлю это в разделе «Ответ» вместо редактирования вопроса, потому что вопрос выглядит достаточно долго, как есть.)

Я только что нашел отличную бумагу на веб -сайт JSoftware Это хорошо работает в сочетании с ответом Джордана и методом, который я описал в вопросе. Автор делает несколько соответствующих наблюдений:

1) глагол, модифицированный наречием, является глаголом.

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

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

d28=: [:+/\{.@],>:@[#(}.-}:)@]%>:@[

[: +/\

{.@] ,

>:@[ #

(}.-}:)@] %

>:@[
  • CAP (плюс инфикс префикс)

    (направляйтесь на правый аргумент) Равель

    (Приращение наверняка левого аргумента) Подсчет

    (Обезглавливание минус сокращение) на правом аргументе

    деленное на

    Приращение на вершине левого аргумента

  • частичные суммы последовательности, определенной

    первый элемент правильного аргумента, сбитый вместе с

    (один плюс левый аргумент) Копии

    (Все, кроме первого элемента) минус (все, кроме последнего элемента)

    правильного аргумента, разделенного на

    (один плюс левый аргумент).

  • частичные суммы последовательности, определенной

    Начиная с той же начальной точки,

    и добавление последовательных копий пунктов, полученных из правильного аргумента

    Вычитание каждого предшественника из его преемника

    и разделение результата на количество копий, которые будут сделаны

  • Интерполяция значений X-MAY между элементами y

Лично я думаю о J -коде с точки зрения того, что он делает - если у меня нет никаких примеров аргументов, я быстро теряюсь. Если у меня есть примеры, обычно мне легко увидеть, что делает субэкспрессия.

И, когда это становится тяжелым, это означает, что мне нужно искать слово в словаре или, возможно, изучить его грамматику.

Читая здесь рецепты, я понимаю, что это не слишком отличается от того, как другие люди работают с языком.

Может быть, нам следует назвать это «понимание испытаний»?

Я просто хочу поговорить о том, как я читаю: <.@-:@#{/: ~

Во -первых, я знал, что если бы это была функция, из командной строки, ее нужно было ввести (для тестирования) как

(<.@-:@#{/:~)

Теперь я посмотрел на вещи в скобках. Я видел A /: ~, который возвращает отсортированный список своих аргументов, {который выбирает элемент из списка, #, который возвращает количество элементов в списке, -: половина и <., Пол ... и я начал думать, что это может быть медианом, - половина количества элементов в списке округлена, но как # получил свои аргументы? Я посмотрел на знаки @ - и понял, что там было три глагола - так что это вилка. Список поступает справа и отсортирован, затем слева, вилка получил список в #, чтобы получить количество аргументов, и тогда мы поняли, что это заняло половину этого. Итак, теперь у нас есть последовательность выполнения:

Сортируйте и передайте выход к среднему глаголу в качестве правильного аргумента.

Возьмите пол половины количества элементов в списке, и это становится левым аргументом среднего глагола.

Сделайте средний глагол.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top