Execute SNUSP is an implementation of SNUSP.
Other implementations of SNUSP.
RCSNUSP
SNUSP
An implementation need only properly implement the Core SNUSP instructions ('$', '\', '/', '+', '-', '<', '>', ',', '.', '!', and '?'). Modular SNUSP ('#', '@') and Bloated SNUSP (':', ';', '%', and '&') are also allowed, but not required. Any extra characters that you implement should be noted in the description of your implementation. Any cell size is allowed, EOF support is optional, as is whether you have bounded or unbounded memory.

import strutils
 
# Requires 5 bytes of data store.
const Hw = r"""
/++++!/===========?\>++.>+.+++++++..+++\
\+++\ | /+>+++++++>/ /++++++++++<<.++>./
$+++/ | \+++++++++>\ \+++++.>.+++.-----\
      \==-<<<<+>+++/ /=.>.+>.--------.-/"""
 
#---------------------------------------------------------------------------------------------------
 
proc snusp(dsLen: int; code: string) =
  ## The interpreter.
 
  var
    ds = newSeq[byte](dsLen)  # Data store.
    dp = 0                    # Data pointer.
    cs = code.splitLines()    # Two dimensional code store.
    ipr, ipc = 0              # Instruction pointers in row ans column.
    dir = 0                   # Direction (0 = right, 1 = down, 2 = left, 3 = up).
 
  # Initialize instruction pointers.
  for r, row in cs:
    ipc = row.find('$')
    if ipc >= 0:
      ipr = r
      break
 
  #.................................................................................................
 
  func step() =
    ## Update the instruction pointers acccording to the direction.
 
    if (dir and 1) == 0:
      inc ipc, 1 - (dir and 2)
    else:
      inc ipr, 1 - (dir and 2)
 
  #.................................................................................................
 
  # Interpreter loop.
  while ipr in 0..cs.high and ipc in 0..cs[ipr].high:
    case cs[ipr][ipc]
    of '>': inc dp
    of '<': dec dp
    of '+': inc ds[dp]
    of '-': dec ds[dp]
    of '.': stdout.write chr(ds[dp])
    of ',': ds[dp] = byte(stdin.readLine()[0])
    of '/': dir = not dir
    of '\\': dir = dir xor 1
    of '!': step()
    of '?': (if ds[dp] == 0: step())
    else: discard
    step()
 
#———————————————————————————————————————————————————————————————————————————————————————————————————
 
when isMainModule:
  snusp(5, Hw)