Gudleifr: Все сообщения за 5 Апреля 2014 года

 
ПнВтСрЧтПтСбВс
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

Gudleifr

опытный

На Филиале Кошачьего Форума опять случился анекдот.
Вопрос:
пишу сортировку на форте. думаю использовать дополнительный стек, или стек возвратов. подскажите, как с ним пользоваться..?
 

Ответ:
code text
  1. 256 CELLS CONSTANT /UserStack
  2. CREATE UserStack /UserStack ALLOT
  3. VARIABLE UserStackPointer
  4.  
  5. : >UserStack   \ ( x - )
  6.   UserStack UserStackPointer @ CELLS + !
  7.   UserStackPointer 1+!
  8. ;
  9.  
  10. : UserStack>   \ ( - x )
  11.   -1 UserStackPointer +!
  12.   UserStack UserStackPointer @ CELLS + @
  13. ;

Отрадно, что на FORTH можно почти понятно и почти удобно написать
code text
  1. int us[256], usp;
  2. ...
  3. us[usp++] = a;
  4. ...
  5. a = us[-usp];

Но зачем тогда FORTH? Где краткость и удобство?
В том-то и дело, что на FORTH нельзя спросить: "Как сделать стек?" Нужно сначала выяснить, какого размера стек, что в него пишем, для чего он нужен?
Например, здесь: "сортировка". Что сортируем, каков объем, по какому алгоритму..? Все получившиеся "стеки" ДОЛЖНЫ быть разными! (Например, возможен строковый стек, тупо размещаемый в словаре).
Я даже прикинул, что, если идет речь о быстросорте, то и обычного стека вполне достаточно...
Хорошо не встрял...

Оказалось, все проще и страшнее.
Спрашивающий реализовывал сортировку пузырьком, гоняя весь массив из одного стека на другой с перестановкой соседей...
Всю эту конструкцию загнал в одно слово.
И когда исправит все ошибки, вполне вероятно это будет работать.
И это FORTH?!
В чем выигрыш? В введении слов >UserStack и UserStack> ?
И еще спрашивают, почему на нем не пишут?
Если писать ТАК, то, действительно, незачем...
 28.028.0

Gudleifr

опытный

P.S. По приведенной спрашивающим программе понял задачу так: отсортировать надо немного небольших целых чисел, заполняющих на момент начала работы стек данных целиком.
Как бы это сделал я? Во-первых, все бы зависело от того, зачем мне это было бы надо. Может, просто записал бы числа на бумажке.
Но, допустим, задача именно такова, какова...

1. Если данные на стеке, то естественно их оттуда брать по одному. Следовательно, сортировать деревом...
2. Где размещать дерево? Как где? В словаре. Не надо никаких ALLOT. Тупо обращаемся со всей памятью после HERE, как с массивом троек "число-меньшие-большие". Никакой очистки после решения, очевидно, тоже не требуется.
3. Надо ли проверять DEPTH при вытаскивании данных из стека? Если у нашей системы есть проверка на исчерпание стека - то нафиг не надо. Само рухнет. Дерево-то останется целым в словаре...

Ну, после HERE немного отступить... Ну, дерево не так хранить... Главное - как удобнее, а не "как у всех"... Сделали - и забыли... В следующий раз - по другому сделаем.
 28.028.0
Это сообщение редактировалось 05.04.2014 в 12:54

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru