2016-03-04 6 views
4

J - это фантастический язык программирования, который я решил изучить. В качестве простого упражнения я решил подражать диапазону. Существует встроенная функция i., которая создает диапазон 0..i-1. Используя некоторые математические, у меня есть, что это диапазон между a и b:Создание глагола диапазона в J

a + i. (b - a - 1) 

Успех! Я думал. Теперь перед мной поставлена ​​«простая» задача преобразования в глагол. Это моя проблема сейчас. У меня есть a (левый аргумент), который вызывается с обеих сторон глагола +. Я думал об использовании вызова, но я не уверен, как заставить его работать.

Итак, мой вопрос: как преобразовать выражение формы a f (a g b) или, точнее, a f (a g b h c) (и аналогичные формы) в чистый глагол? Я не хочу использовать явные аргументы, для чего это забавно? ;)

EDIT Мое решение, как так:

range =: [(+i.)>:@-~ 
+0

Приятная работа с этим решением, хотя на самом деле вам не нужна ~ с +, потому что + рефлексивно. range =: [(+ i.)>: @ - ~ должен работать так же хорошо. – bob

+0

@bob, так оно и есть! Благодаря! –

ответ

5

Чтобы преобразовать выражение вида x f (x g y) к форме x h y вы можете использовать двоичную вилку:

x (F G H) y = (x F y) G (x H y) 

и тождественный глагол: x [ y = x, и:

x ([ f g) y = (x [ y) f (x g y) = x f (x g y) 

Итак, глагол, который вы ищете, - h =: [ f g

+0

Глаголы в J имеют правые и (необязательно) левые аргументы; вы не можете иметь общую форму для глагола, требующего 'a',' b', ** и ** 'c'. Обычно некоторые из них были помещены в коробку и переданы как один аргумент. – Eelvex

+0

Спасибо вам за неоценимую помощь! –

+2

Я ничего не знаю о J, но те закрытые квадратные скобки заставляют меня чувствовать себя некомфортно. – flawr