all repos — min @ 6482875ac5918f3b68f5d5c2c3de1ec1376cd469

A small but practical concatenative programming language.

minim.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
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
import streams, tables, parseopt2
import parser, interpreter, primitives


const version* = "0.1.0"

let usage* = "  MiNiM v" & version & " - a tiny concatenative programming language" & """

  (c) 2014 Fabio Cevasco
  
  Usage:
    minim [options] [filename]

  Arguments:
    filename  A minim file to interpret.
  Options:
    -e, --evaluate    Evaluate a minim program inline
    -h, --help        Print this help
    -v, --version     Print the program version"""

proc minimStream*(s: PStream, filename: string) =
  var i = newMinInterpreter()
  i.open(s, filename)
  discard i.parser.getToken() 
  i.interpret()
  i.close()

proc minimString*(buffer: string) =
    minimStream(newStringStream(buffer), "input")

proc minimFile*(filename: string) =
  var stream = newFileStream(filename, fmRead)
  if stream == nil:
    writeln(stderr, "Error - Cannot read from file: "& filename)
    flushFile(stderr)
  minimStream(stream, filename)

###

var file, str: string = ""

for kind, key, val in getopt():
  case kind:
    of cmdArgument:
      file = key
    of cmdLongOption, cmdShortOption:
      case key:
        of "evaluate", "e":
          str = val
        of "help", "h":
          echo usage
        of "version", "v":
          echo version
    else:
      discard

if str != "":
  minimString(str)
elif file != "":
  minimFile(file)
else:
  echo usage