Я пытаюсь написать слово Forth, которое удалит все элементы в стеке. Я использую довольно тупой метод, запуская бесконечный цикл с помощью «drop» и перехватывая ошибку, когда «drop» терпит неудачу, потому что стек пуст.
Мои слова определяются так:
( Infinite drop loop)
: droploop begin drop true while drop repeat ;
( Experimental catch with a single drop)
: dropcatcher ['] drop catch drop ;
( Like dropcatcher, but with 'droploop' instead of 'drop')
: dropall ['] droploop catch drop ;
Когда я запускаю droploop, я получаю ошибку, как и ожидал, и после выполнения стек пуст. Когда я запускаю dropcatcher, он падает, если стек не пуст, а если стек пуст, он ничего не сообщает. Когда я запускаю dropall, я получаю все, что осталось в стеке.
Это выглядит так:
2 3 4 5 6 7 8 9 10 dropall .s ‹9> -1 3 -1 5 -1 7 -1 9 -1 ок
Я ожидал, что dropall просто очистит стек без жалоб, потому что droploop и dropcatcher, кажется, работают сами по себе, но, увы, я не понимаю, почему dropall не работает.
Почему dropall работает иначе, чем droploop и dropcatcher? Или, что я делаю неправильно здесь?