all repos — min @ 348fc9a09c3c5d63115719799a132645dd2e953d

A small but practical concatenative programming language.

lib/stack.nim

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
import tables
import 
  ../core/types,
  ../core/parser, 
  ../core/interpreter, 
  ../core/utils

  # Common stack operations
  
define("stack")

  .symbol("id") do (i: In):
    discard
  
  .symbol("pop") do (i: In):
    discard i.pop
  
  .symbol("dup") do (i: In):
    i.push i.peek
  
  .symbol("dip") do (i: In):
    var q = i.pop
    if not q.isQuotation:
      i.error errNoQuotation
    let v = i.pop
    i.unquote("<dip>", q)
    i.push v
  
  .symbol("swap") do (i: In):
    let a = i.pop
    let b = i.pop
    i.push a
    i.push b
  
  .symbol("sip") do (i: In):
    var a = i.pop
    let b = i.pop
    if a.isQuotation and b.isQuotation:
      i.push b
      i.unquote("<sip>", a)
      i.push b
    else:
      i.error(errIncorrect, "Two quotations are required on the stack")

  .finalize()