function process.spawn(f, env, name, path)
  checkArg(1, f, "function")
  checkArg(2, env, "table", "nil")
  checkArg(3, name, "string", "nil")
  checkArg(4, path, "string", "nil")

  local process = findProcess()
  if process then
    env = env or process.env
  end
  if not path then
    path = '<function>'
  end
  env = setmetatable({}, {__index=env or _G})
  local thread = coroutine_create(f)
  running[thread] = {
    path = path,
    command = name,
    env = env,
    data = setmetatable({}, {__index=process and process.data or nil}),
    parent = process,
    instances = setmetatable({}, {__mode="v"})
  }
  return thread
end