Изучаю 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.
)
Работает. Но всё равно довольно длинно :(