На Филиале Кошачьего Форума опять случился анекдот.
Вопрос:
пишу сортировку на форте. думаю использовать дополнительный стек, или стек возвратов. подскажите, как с ним пользоваться..?
Ответ:
code text
256 CELLS CONSTANT /UserStack
CREATE UserStack /UserStack ALLOT
VARIABLE UserStackPointer
: >UserStack \ ( x - )
UserStack UserStackPointer @ CELLS + !
UserStackPointer 1+!
;
: UserStack> \ ( - x )
-1 UserStackPointer +!
UserStack UserStackPointer @ CELLS + @
;
Отрадно, что на FORTH можно почти понятно и почти удобно написать
code text
int us[256], usp;
...
us[usp++] = a;
...
a = us[-usp];
Но зачем тогда FORTH? Где краткость и удобство?
В том-то и дело, что на FORTH нельзя спросить: "Как сделать стек?" Нужно сначала выяснить, какого размера стек, что в него пишем, для чего он нужен?
Например, здесь: "сортировка". Что сортируем, каков объем, по какому алгоритму..? Все получившиеся "стеки" ДОЛЖНЫ быть разными! (Например, возможен строковый стек, тупо размещаемый в словаре).
Я даже прикинул, что, если идет речь о быстросорте, то и обычного стека вполне достаточно...
Хорошо не встрял...
Оказалось, все проще и страшнее.
Спрашивающий реализовывал сортировку пузырьком, гоняя весь массив из одного стека на другой с перестановкой соседей...
Всю эту конструкцию загнал в одно слово.
И когда исправит все ошибки, вполне вероятно это будет работать.
И это FORTH?!
В чем выигрыш? В введении слов >UserStack и UserStack> ?
И еще спрашивают, почему на нем не пишут?
Если писать ТАК, то, действительно, незачем...