2013-11-22 9 views
7

ho visto che in un interview with Chuck Moore, dice:Implementare SWAP a Forth

Le parole che manipolano quella pila sono DUP, DROP e OVER periodo. Non c'è, beh SWAP è molto conveniente e lo vuoi, ma non è un'istruzione macchina.

così ho cercato di implementare SWAP in termini di solo DUP, DROP e OVER, ma non riusciva a capire come farlo, senza aumentare lo stack di almeno.

Come è fatto, davvero?

+0

Non è questo il suo punto? Forse sto fraintendendo la domanda però. –

+1

@ AndréLaszlo Il suo punto è che SWAP è implementato in termini di altre istruzioni, come DUP, DROP e OVER. Ma come lo fai, senza aumentare lo stack? – sashoalm

+0

"Ma come si fa, senza aumentare lo stack?", Anche temporaneamente? –

risposta

7

Hai ragione, sembra difficile o impossibile con solo dup, drop e oltre.

direi l'i21 probabilmente ha anche qualche manipolazione pila sorta di ritorno, in modo da questo dovrebbe funzionare:

: swap over 2>r drop 2r> ; 

Edit: Sul GA144, che pure non ha uno swap nativa, è implementato come:

over push over or or pop 

Push e pop riferiscono alla pila ritorno, or è in realtà xor. Vedere http://www.colorforth.com/inst.htm

+0

Infatti, su F18 questo è un modo per fare uno scambio ('over push over o o pop'). Un altro potrebbe essere "over push push drop pop pop". Ancora un altro, con meno istruzioni ma usando il registro A, potrebbe essere 'push a! pop a'. – AshleyF

+1

Vorrei anche ricordare che essenzialmente è * già * un "scambio" di sorta, tranne che lascia un valore. Le sue chips hanno stack circolari e quindi a volte questo non è un problema. Oppure puoi ripulire più tardi con un 'drop' dopo che i valori principali sono stati consumati. Quindi, in molti casi, 'over' viene usato al posto di 'swap'. – AshleyF

3

In standard Forth è

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

o

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

o

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

o

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