all repos — min @ 568d793dca984d3e6735c9a6845f5fe9a31ec1be

A small but practical concatenative programming language.

lib/min_comm.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
 63
 64
 65
 66
 67
import strutils, critbits, streams
import 
  ../core/types,
  ../core/parser, 
  ../core/interpreter, 
  ../core/utils,
  ../core/server

# I/O 


proc comm_module*(i: In) =
  i.define("comm")
    
    .symbol("reg") do (i: In):
      var host, address: MinValue
      i.reqTwoStringLike(host, address)
      i.link.hosts[host.getString] = address.getString
      for host, response in i.syncHosts().pairs:
        echo host, ": ", response
      cfgSet("hosts", %i.link.hosts)

    .symbol("unreg") do (i: In):
      i.link.hosts.excl(i.link.name)
      for host, response in i.syncHosts().pairs:
        echo host, ": ", response
      cfgSet("hosts", %i.link.hosts)
    
    .symbol("set-hosts") do (i: In):
      var q: MinValue
      i.reqQuotation(q)
      for key, val in i.link.hosts.pairs:
        i.link.hosts.excl(key)
      for pair in q.qVal:
        let vals = pair.qVal
        if not pair.isQuotation or vals.len != 2 or not vals[0].isStringLike or not vals[1].isStringLike:
          raiseInvalid("Invalid host quotation")
        i.link.hosts.replace(vals[0].getString, vals[1].getString)
      cfgSet("hosts", %i.link.hosts)
      i.push("OK".newVal)

    .symbol("hosts") do (i: In):
      var q = newSeq[MinValue](0).newVal
      for key, val in i.link.hosts.pairs:
        q.qVal.add(@[key.newSym, val.newSym].newVal)
      i.push q

    .symbol("host") do (i: In):
      i.push i.link.name.newVal

    .symbol("to-host") do (i: In):
      var h, q: MinValue
      i.reqStringLikeAndQuotation(h, q)
      let host = h.getString
      i.eval i.executeOnHost(host, q)

    .symbol("to-all-hosts") do (i: In):
      var q: MinValue
      i.reqQuotation(q)
      var res = ""
      for host in i.link.hosts.keys:
        if host != i.link.name:
          res = res & " " & i.executeOnHost(host, q)
      i.eval("($1)" % res)


    .finalize()