require

Searches for a module on the current library path, returning the module or raising an error if it cannot be found.

require
Function
Syntax
require(
  • module : string
)

Returns anything
API shell
Source CC:Tweaked

Creating a library for require

A library is a collection of useful functions and other definitions which is stored separately to your main program. You might want to create a library because you have some functions which are used in multiple programs, or just to split your program into multiple more modular files.

Let's say we want to create a small library to make working with the terminal a little easier. We'll provide two functions: reset, which clears the terminal and sets the cursor to (1, 1), and write_center, which prints some text in the middle of the screen.

Start off by creating a file called more_term.lua:


local function reset()
  term.clear()
  term.setCursorPos(1, 1)
end

local function write_center(text)
  local x, y = term.getCursorPos()
  local width, height = term.getSize()
  term.setCursorPos(math.floor((width - #text) / 2) + 1, y)
  term.write(text) 
end

return { reset = reset, write_center = write_center }

Now, what's going on here? We define our two functions as one might expect, and then at the bottom return a table with the two functions. When we require this library, this table is what is returned. With that, we can then call the original functions. Now create a new file, with the following:


local more_term = require("more_term")
more_term.reset()
more_term.write_center("Hello, world!")

When run, this'll clear the screen and print some text in the middle of the first line.

require in depth

While the previous section is a good introduction to how require operates, there are a couple of remaining points which are worth mentioning for more advanced usage.

Libraries can return anything

In our above example, we return a table containing the functions we want to expose. However, it's worth pointing out that you can return anything from your library - a table, a function or even just a string! require treats them all the same, and just returns whatever your library provides.

Module resolution and the package path

In the above examples, we defined our library in a file, and require read from it. While this is what you'll do most of the time, it is possible to make require look elsewhere for your library, such as downloading from a website or loading from an in-memory library store.

As a result, the module name you pass to require doesn't correspond to a file path. One common mistake is to load code from a sub-directory using require("folder/library") or even require("folder/library.lua"), neither of which will do quite what you expect.

When loading libraries (also referred to as modules) from files, require searches along the module path. By default, this looks something like:

  • ?.lua
  • ?/init.lua
  • /rom/modules/main/?.lua
  • etc...

When you call require("my_library"), require replaces the ? in each element of the path with your module name, and checks if the file exists. In this case, we'd look for my_library.lua, my_library/init.lua, /rom/modules/main/my_library.lua and so on. Note that this works relative to the current program, so if your program is actually called folder/program, then we'll look for folder/my_library.lua, etc...

One other caveat is loading libraries from sub-directories. For instance, say we have a file my/fancy/library.lua. This can be loaded by using require("my.fancy.library") - the '.'s are replaced with '/' before we start looking for the library.

gollark: +<help
gollark: ++data get bismuth
gollark: It ignores webhooks.
gollark: ++magic reload_ext userdata
gollark: ++magic py reload_ext userdata


ExampleLoading the cc.expect library
Loads the built-in cc.expect module, and uses it within a function
Code
local expect = require("cc.expect").expect
local function check_string(x)
  expect(1, x, "string")
end

check_string(123)
Output
bad argument #1 to 'check_string' (expected string, got number)
This article is issued from Computercraft. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.