48 lines
1.1 KiB
Go
48 lines
1.1 KiB
Go
|
package postscript
|
||
|
|
||
|
func pop(interpreter *Interpreter) {
|
||
|
interpreter.Pop()
|
||
|
}
|
||
|
|
||
|
func dup(interpreter *Interpreter) {
|
||
|
interpreter.Push(interpreter.Peek())
|
||
|
}
|
||
|
|
||
|
func index(interpreter *Interpreter) {
|
||
|
f := interpreter.PopInt()
|
||
|
interpreter.Push(interpreter.Get(int(f)))
|
||
|
}
|
||
|
|
||
|
func roll(interpreter *Interpreter) {
|
||
|
j := interpreter.PopInt()
|
||
|
n := interpreter.PopInt()
|
||
|
values := interpreter.PopValues(n)
|
||
|
j %= n
|
||
|
for i := 0; i < n; i++ {
|
||
|
interpreter.Push(values[(n+i-j)%n])
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func copystack(interpreter *Interpreter) {
|
||
|
n := interpreter.PopInt()
|
||
|
values := interpreter.GetValues(n)
|
||
|
for _, value := range values {
|
||
|
interpreter.Push(value)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func exch(interpreter *Interpreter) {
|
||
|
value1 := interpreter.Pop()
|
||
|
value2 := interpreter.Pop()
|
||
|
interpreter.Push(value1)
|
||
|
interpreter.Push(value2)
|
||
|
}
|
||
|
|
||
|
func initStackOperator(interpreter * Interpreter) {
|
||
|
interpreter.SystemDefine("pop", NewOperator(pop))
|
||
|
interpreter.SystemDefine("dup", NewOperator(dup))
|
||
|
interpreter.SystemDefine("index", NewOperator(index))
|
||
|
interpreter.SystemDefine("copy", NewOperator(copystack))
|
||
|
interpreter.SystemDefine("roll", NewOperator(roll))
|
||
|
interpreter.SystemDefine("exch", NewOperator(exch))
|
||
|
}
|