В предыдущем посте я написал о своем прогрессе в 10-й главе Начала вперед Лео Броди. Сегодня мы поднимемся на главу вверх и поговорим об определении и составлении слов. Вот мои ответы на упражнения.

11.1: В gforth s”помещает в стек два значения: адрес строки и количество содержащихся в ней символов, количество. Согласно документации gforth, в стандартных программах следует предполагать, что строка живет только до следующего s". Ввот почему мы должны извлекать содержимое по адресу и сохранять его в новом месте в памяти, а не просто сохранять адрес, который был помещен s” в стек (это выполняется циклом do). Вы могли бы использовать это слово для создания новых слов, подобных этому: s" somefile.fs" loaded-by someword

11.2: Слова, определенные с помощью based.print, указывают элемент наверху стека в базе, с которой они были определены, без изменения текущей базы. Во время их выполнения мы должны сохранить текущую базу в стеке возврата, чтобы мы могли вернуться к ней позже. Используйте его так: decimal 16 based. h. 17 dup h. .должен вернуть 11 17

11.3: Мы сохраняем токен выполнения (адрес, указывающий на фрагмент скомпилированного кода) в слове и запускаем его с помощью цикла do.

11.4: Мне было немного сложно это понять, несмотря на то, что это было так просто.

11.5: Это было самым сложным для меня. Думаю, я до сих пор не очень хорошо разбираюсь в вводе-выводе в Forth. Интересная часть упражнения заключается в том, что вы легко можете изменить работу интерпретатора. Я решил, что буду обрабатывать случаи, когда счетчик циклов равен 1, так же, как и когда он недействителен (0 или отрицательный): т.е. выполнение остальной части строки, как будто функция циклов никогда не выполнялась. Программа плохо оптимизирована, так как вы повторяете первый тест без необходимости и получаете одни и те же адреса и считаете снова и снова в цикле.

В заключение я думаю, что возможность создавать новые компиляторы (определяющие слова) и изменять поток компиляции (с немедленным, отложенным, [ и ]) — это то, что отличает его от других языков. Это сделано вполне естественно и без лишних накладных расходов, что всегда приятно.