J, сократить исходник
От: pongo  
Дата: 10.12.05 11:08
Оценка:
Изучаю J. Мне еще много-много-много предстоит изучить, но всё же.
Решил написать примерчик таблицы "должников". То есть таблица, в которой бы хранилось кто вам чего должен (такую очень удобно в блокноте вести...)

   newArray=: ". ;. _2
   db=: newArray 0 : 0
'Debtor';'Date';'Debt'
)
   add=: monad : 'db=:db,y.'
   load 'printf'
   today=: 3 {. 6!:0 ''
   add ('Катя';today;'Диск Психея Романтическая Коллекция')
   add ('Петя';today;'250 рублей')

Отлично. Теперь посмотрим на таблицу
   db
+------+----------+-----------------------------------+
|Debtor|Date      |Debt                               |
+------+----------+-----------------------------------+
|Катя  |2005 12 10|Диск Психея Романтическая Коллекция|
+------+----------+-----------------------------------+
|Петя  |2005 12 10|250 рублей                         |
+------+----------+-----------------------------------+

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

   view=: 3 : 0
for_item. y. do.
  if. item_index ~: 0 do.
    'index:\t%d' printf item_index
    'debtor:\t%j' printf 0{item
    'date:\t%j' printf 1{item
    'debt:\t%j\n' printf 2{item
  end.
end.
)


   view db
index:    1
debtor:    Катя
date:    2005 12 10
debt:    Диск Психея Романтическая Коллекция

index:    2
debtor:    Петя
date:    2005 12 10
debt:    250 рублей


Вспомнив про исходники kbd и других программ на k я подумал что хорошо бы сократить это дело. После долгих мучений выдал вот такой вариант:
view2=: 3 : 0
for_item. y. do.
  t1=:  'index:\t%j\n' , 'debtor:\t%j\n' , 'date:\t%j\n' , 'debt:\t%j\n'
  t2=:> <item_index    ; >0{item         ; >1{item       ; >2{item
  t1 printf t2
end.
)

Затем я захотел избавиться от :\t%j\n
   addstr=: 3 : 0
y.,':\t%j\n'
)

   view=: 3 : 0
for_item. y. do.
  t2=:> <item_index ; >0{item  ; >1{item ; >2{item
  t1=:  'index'     ; 'debtor' ; 'date'  ; 'debt'
  t1=: '%s%s%s%s' sprintf addstr each t1
  t1 printf t2
end.
)


Работает. Но всё равно довольно длинно :(
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.