20.3 Application: reimplementing source()

What do we need?

  • Read the file being sourced.
  • Parse its expressions (quote them?)
  • Evaluate each expression saving the results
  • Return the results
source2 <- function(path, env = caller_env()) {
  file <- paste(readLines(path, warn = FALSE), collapse = "\n")
  exprs <- parse_exprs(file)

  res <- NULL
  for (i in seq_along(exprs)) {
    res <- eval(exprs[[i]], env)
  }

  invisible(res)
}

The real source is much more complex.