Лучшие стратегии чтения J код

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

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

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

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

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

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.), Но если я наткнулся на него без какой-либо предшествующей истории или документации, выяснив, что это - то, что это делает, было бы нетривиальное осуществление.

11
задан Yasir Arsanukaev 21 May 2010 в 13:50
поделиться

2 ответа

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

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

Я знаю, что <. -: # { и /: - это глаголы, ~ - наречие, а @ - союз (см. ссылку на части речи в словаре). Поэтому я вижу, что это вилочная структура с левым глаголом <.@-:@# , правым глаголом /:~ , и диадой { . Это требует некоторой практики, но есть более простой способ, позвольте 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, пытаясь разбить на части большие сложные глаголы. Думаю, я бы рекомендовал сосредоточиться на попытке увидеть грамматическую структуру, а затем разобраться с частями, выстраивая ее шаг за шагом (поскольку именно так вы в конечном итоге будете писать негласные глаголы).

9
ответ дан 3 December 2019 в 04:31
поделиться

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

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

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

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

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

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

[: +/\

{.@] ,

>:@[ #

(}.-}:)@] %

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

    (верхний правый аргумент) ravel

    (приращение верхнего левого аргумента) tally

    (behead минус сокращение) наверху справа аргумент

    , деленный на

    , увеличивает на верхний левый аргумент

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

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

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

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

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

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

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

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

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

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

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

  • Интерполяция значений x-many между элементы y
3
ответ дан 3 December 2019 в 04:31
поделиться