Чтобы параметризовать оба значения и, таким образом, обобщить до диадического глагола, нам нужно передать каждый из параметров туда, где они нужны. Мы можем сосредоточиться на единственной точке, где 3 5
действительно нужен, начав с этой вилки:
3 5 ([ |/ i.@]) 1000
В общей программе нам нужен список целых чисел в двух местах. Имя (n
) дало нам простой способ использовать этот список в обоих местах. Чтобы быстро поставить всю программу на место, при написании этого списка я изначально вычислил список дважды:
3 5 ([: +/ i.@] # [:+./ 0= [ |/ i.@]) 1000
Это позволяет сформулировать всю вашу программу как двоичный глагол, но есть недостатки в том, что i.
появляется дважды. Мы можем извлечь его так, чтобы он возникал только один раз, сделав его правильным зубцом вилки. В центре этой развилки находится новый внутренний глагол.
3 5 ([: +/ [ (] # [:+./ 0= [ |/ ]) i.@]) 1000
NB. ___________________ new "inner" verb, parenthesized
Этот внутренний глагол должен получить 3 5
в качестве аргумента, поэтому я передаю левый аргумент самого внешнего глагола в качестве левого аргумента этому внутреннему глаголу. Это означает, что Left ([
) во внутреннем глаголе имеет то же значение, что и в предыдущей версии, когда оно ссылалось на самый внешний аргумент. В этом новом глаголе Right (]
) имеется в виду список целых чисел, встречающихся в двух местах, где i.@]
появлялось раньше.
Постскриптум: как вы показали в своем комментарии, [ |/ ]
упрощается до |/
person
kaleidic
schedule
28.02.2013