Реализовать SWAP в Forth

Я видел это в интервью с Чаком Муром, он говорит:

Слова, которые манипулируют этим стеком, — это DUP, DROP и OVER период. Нет, ну SWAP очень удобен и хочется, но это не машинная инструкция.

Итак, я попытался реализовать SWAP только с точки зрения DUP, DROP и OVER, но не мог понять, как это сделать, по крайней мере, без увеличения стека.

Как это делается, правда?


person sashoalm    schedule 22.11.2013    source источник
comment
Разве это не его точка зрения? Хотя, возможно, я неправильно понимаю вопрос.   -  person André Laszlo    schedule 22.11.2013
comment
@AndréLaszlo Его точка зрения заключается в том, что SWAP реализован с точки зрения других инструкций, таких как DUP, DROP и OVER. Но как это сделать, не увеличивая стек?   -  person sashoalm    schedule 22.11.2013
comment
Но как это сделать, не увеличивая стек?, даже временно?   -  person André Laszlo    schedule 22.11.2013
comment
@AndréLaszlo Нет, начиная со стека «1 2», невозможно закончить стеком «2 1», используя только те 3 инструкции, которые он упоминает. Вы можете использовать OVER, чтобы получить «1 2 1», но это не «2 1».   -  person sashoalm    schedule 22.11.2013
comment
Я попробовал 1 2 OVER DROP . . здесь forthfreak.net/jsforth80x25.html. Кажется, работает?   -  person André Laszlo    schedule 22.11.2013
comment
@AndréLaszlo Таким образом, вы снова получите 1 2. Суть была в том, чтобы поменять их местами.   -  person sashoalm    schedule 22.11.2013
comment
Да извини. Тут совсем запутался :)   -  person André Laszlo    schedule 22.11.2013
comment
И вы не можете использовать стек возврата? :)   -  person André Laszlo    schedule 22.11.2013
comment
@AndréLaszlo Кажется, это способ сделать это, посмотрите принятый ответ, мне это никогда не приходило в голову.   -  person sashoalm    schedule 22.11.2013


Ответы (3)


Вы правы, это кажется трудным или невозможным, если просто дублировать, отбрасывать и заканчивать.

Я предполагаю, что i21 вероятно также имеет какую-то манипуляцию со стеком возврата, так что это сработает:

: swap   over 2>r drop 2r> ;

Редактировать: на GA144, у которого также нет собственного свопа, он реализован как:

over push over or or pop

Push и pop относятся к стеку возврата, or на самом деле является xor. См. http://www.colorforth.com/inst.htm.

person Lars Brinkhoff    schedule 22.11.2013
comment
Действительно, на F18 это один из способов сделать swap (over push over or or pop). Другой может быть over push push drop pop pop. Еще один, с меньшим количеством инструкций, но использующий регистр A, может быть push a! pop a. - person AshleyF; 23.11.2013
comment
Я бы также упомянул, что по существу over является уже чем-то вроде swap, за исключением того, что оно оставляет после себя значение. Его фишки имеют круглые стеки, так что иногда это не проблема. Или вы можете очистить позже с помощью drop после того, как будут использованы верхние значения. Так что действительно, over используется вместо swap во многих случаях. - person AshleyF; 23.11.2013

В стандартном форте это

: swap ( a b -- b a ) >r >r 2r> ;

or

: swap ( a b -- b a ) 0 rot nip ; 

or

: swap ( a b -- b a ) 0 rot + ;

or

: swap ( a b -- b a ) 0 rot or ;
person Marcel Hendrix    schedule 07.04.2014

Это замечание Чарльза Мура легко может быть неправильно понято, потому что оно относится к контексту его процессоров Forth. SWAP не является машинной инструкцией для аппаратного процессора Forth. Вообще в Форте некоторые определения даны в терминах других определений, но это заканчивается некоторыми так называемыми примитивами. В процессоре Forth они реализованы аппаратно, но во всех реализациях Forth, например. хост-системы или одноплатные компьютеры реализуются с помощью последовательности машинных инструкций, например. для Интел:

CODE SWAP pop, ax pop, bx push, ax push, bx END-CODE

Он также использует термин «удобный», потому что SWAP часто можно избежать. Это ситуация, когда вам нужно обработать два элемента данных, но они расположены не в том порядке, в котором вы хотите. SWAP означает умственную нагрузку, потому что вы должны представить, что содержимое стека изменилось. Часто можно поддерживать порядок в стеке, используя вспомогательный стек для временного хранения предмета, который вам сейчас не нужен. Или, если вам нужен элемент дважды OVER предпочтительнее. Или слово может быть определено по-другому, с его параметрами в другом порядке.

Пытаться реализовать SWAP с помощью 4-х слов FORTH вместо 4-х машинных инструкций явно контрпродуктивно, потому что каждое из этих FORTH-слов должно быть реализовано парой машинных инструкций.

person Albert van der Horst    schedule 30.08.2018