Mimics
Inactive cells
Active cells
Specs
Inactive cells (details)
kind = "Message Rewriter"
Active cells (details)
match(msg, pattern)

nil

method(msg, pattern, 
  Unification tryUnify(pattern, msg) 
  )
rewrite(msg, pattern, recurse false)

nil

method(msg, pattern, recurse false, 
  start = nil 
  current = nil 
  m_msg = msg 
  while(m_msg, 
    oldArguments = m_msg arguments 
    if(recurse &&(!(Unification internal:literal?(m_msg))), 
      m_msg arguments = m_msg arguments map(mm, 
          if(Unification internal:literal?(mm), 
            mm, 
            rewrite(mm, pattern, true)))) 
    m = match(m_msg, pattern key) 
    result = if(m, 
        rewriteWith(m, pattern value), 
        m_msg mimic 
        ) 
    m_msg arguments = oldArguments 
    if(start nil?, 
      start = result 
      current = start last, 
      current ->(result) 
      current = current last 
      ) 
    if(m, 
      m nexts times(if(m_msg, m_msg = m_msg next)), 
      m_msg = m_msg next) 
    ) 
  start 
  )
rewriteWith(u, pattern)

nil

method(u, pattern, 
  start = nil 
  current = nil 
  p = pattern 
  while(p, 
    res = if(p symbol?, 
        (msg, count) = u unifications [](p name) 
        res = msg mimic 
        curr = msg 
        (1 ...(count)) each(n, 
          curr = curr next 
          newObj = curr mimic 
          res last ->(newObj) 
          ) 
        res, 
        p mimic) 
    unless(u internal:literal?(res), 
      res arguments = p arguments map(a, 
          rewriteWith(u, a))) 
    if(start nil?, 
      start = res 
      current = start, 
      current last ->(res) 
      current = current last) 
    p = p next 
    ) 
  start 
  )