2010-05-02 6 views
11

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

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

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

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

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

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

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

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

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

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

EDIT:

Пример подобного кода мне нужно будет разрушаться следующий:

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

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

ответ

9

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

Рассмотрим следующий простой пример: <[email protected]:@#{/:~

Я знаю, что <.-:#{ и /: все глаголы, ~ является наречием и @ является конъюнкция (см части речи ссылке в Vocab). Поэтому я вижу, что это структура вилки с левым глаголом <[email protected]:@#, правый глагол /:~ и dyad {.Это требует некоторой практики, чтобы увидеть, но есть более простой способ, пусть J показать вам структуру, введя его в ijx окна и нажав введите:

<[email protected]:@#{/:~ 
+---------------+-+------+ 
|+---------+-+-+|{|+--+-+| 
||+--+-+--+|@|#|| ||/:|~|| 
|||<.|@|-:|| | || |+--+-+| 
||+--+-+--+| | || |  | 
|+---------+-+-+| |  | 
+---------------+-+------+ 

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

10?20 
15 10 18 7 17 12 19 16 4 2 
    /:~ 10?20 
1 4 6 7 8 10 11 15 17 19 
    <[email protected]:@# 10?20 
5 

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

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

+0

Интересно. Я никогда не нарушал вещи явно в терминах частей речи раньше - как правило, мое мышление остается на уровне структуры против операторов вещества, по крайней мере, когда я декодирую молчаливые глаголы в J-разговорнике для практики или пытаюсь понять о том, что думал о нем, Роджер Хуэй, когда писал свои решения Project Euler. – estanford

3

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

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

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

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

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

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

[: +/\ 

{[email protected]] , 

>:@[ # 

(}.-}:)@] % 

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

    (голова поверх правого аргумента) моток

    (прирост на вершине левого аргумента) вяжется

    (обезглавить минус свертывание) поверх правых аргумента

    делится на

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

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

    первого пункт правого аргумента, распущенных вместе с

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

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

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

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

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

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

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

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

    и деление результата на номер копий быть

  • Интерполирующие х-много значений между пункты у
1

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

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

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

Возможно, нам следует назвать это «Испытательное управление»?

1

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

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

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

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

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

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

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

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

10

Просто хотел бы добавить к Jordan's Answer: если у вас нет коробки дисплей включен, вы можете форматировать вещи таким образом явно с 5!:2

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

Там также дерево дисплей:

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

См. Страницу терминов для 5!: Representation, а также 9!: Global Parameters для изменения по умолчанию.

Кроме того, для моего достоинства мой собственный подход к чтению 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