代码 | Code

用于管理代码编译,代码评估和代码加载的实用程序。

该模块补充了Erlang的:code模块,添加了Elixir特有的行为。几乎这个模块中的所有功能都对Elixir的行为有全局性的副作用。

概要

功能

append_path(path)

在Erlang VM代码路径列表的末尾附加一个路径

available_compiler_options()

用可用的编译器选项返回一个列表

compile_quoted(quoted, file \ "nofile")

编译引用的表达式

compile_string(string, file \ "nofile")

编译给定的字符串

compiler_options()

从代码服务器获取编译选项

compiler_options(opts)

设置编译选项

delete_path(path)

从Erlang VM代码路径列表中删除路径。这是Erlang VM用于查找模块代码的目录列表

ensure_compiled(module)

确保给定的模块被编译和加载

ensure_compiled?(module)

确保给定的模块被编译和加载

ensure_loaded(module)

确保给定的模块已加载

ensure_loaded?(module)

确保给定的模块已加载

eval_file(file, relative_to \ nil)

等待给定的文件

eval_quoted(quoted, binding \ [], opts \ [])

评估报价内容

eval_string(string, binding \ [], opts \ [])

评估给出的内容 string

get_docs(module, kind)

返回给定模块的文档

load_file(file, relative_to \ nil)

加载给定的文件

loaded_files()

列出所有加载的文件

prepend_path(path)

在Erlang VM代码路径列表的开始处添加一条路径

require_file(file, relative_to \ nil)

需要给定的文件

string_to_quoted(string,opts \ [])

将给定的字符串转换为其引用形式

string_to_quoted!(string, opts \ [])

将给定的字符串转换为其引用形式

unload_files(文件)

从加载的文件列表中删除文件

功能

append_path(path)

在Erlang VM代码路径列表的末尾附加一个路径。

这是ErlangVM用于查找模块代码的目录列表。

路径Path.expand/1在被追加之前被扩展。如果此路径不存在,则返回错误。

实例

Code.append_path(".") #=> true Code.append_path("/does_not_exist") #=> {:error, :bad_directory}

available_compiler_options()

返回带有可用编译器选项的列表。

查看Code.compiler_options/1更多信息。

实例

iex> Code.available_compiler_options [:docs, :debug_info, :ignore_module_conflict, :relative_paths, :warnings_as_errors]

compile_quoted(quoted, file \ "nofile")

编译引用的表达式。

返回一个元组列表,其中第一个元素是模块名称,第二个元素是它的字节码(作为二进制文件)。

compile_string(string, file \ "nofile")

编译给定的字符串。

返回一个元组列表,其中第一个元素是模块名称,第二个元素是它的字节码(作为二进制文件)。

要一次编译多个文件,请检查Kernel.ParallelCompiler.files/2

compiler_options()

从代码服务器获取编译选项。

检查compiler_options/1更多信息。

实例

Code.compiler_options #=> %{debug_info: true, docs: true, warnings_as_errors: false, ignore_module_conflict: false}

compiler_options(选)

设置编译选项。

这些选项是全球性的,因为它们是由Elixir的代码服务器存储的。

可供选择的办法有:

  • :docs - 如果为true,则保留编译模块中的文档,默认为true

  • :debug_info - 如果为true,则保留编译模块中的调试信息; 这允许开发人员重建原始源代码,默认为false

  • :ignore_module_conflict - 如果为true,则覆盖已经定义但不会引发错误的模块,默认为false

  • :relative_paths - 如果为true,则在带引号的节点中使用相对路径,编译器生成的警告和错误,默认情况下为true。 注意禁用此选项不会影响运行时警告和错误。

:warnings_as_errors - 在生成警告时导致编译失败它将返回编译器选项的新表.ExamplesCode.compiler_options(debug_info:true)#=>%{debug_info:true,docs:true,

  • :file - 评估中要考虑的文件

  • :line - 脚本开始的行

另外,可以配置以下范围值:

  • :aliases - 具有别名及其目标的元组列表

  • :requires - 需要的模块列表

  • :functions - 第一个元素是模块的元组列表,第二个是导入的函数名称和元组列​​表; 函数名称和参数列表必须进行排序

  • :macros - 第一个元素是模块的元组列表,第二个是导入的宏名称和元组列​​表; 函数名称和参数列表必须进行排序

请注意,设置上述任何值都会覆盖Elixir的默认值。 例如,设置:需要[],将不再自动需要内核模块; 以相同的方式设置:宏将不再像例如/ 2,case / 2等那样自动导入内核宏

返回格式为{value,binding}的元组,其中value是从评估字符串返回的值。 如果在评估字符串时发生错误,则会引发异常。

绑定是一个关键字列表,其中包含评估字符串后所有变量绑定的值。 绑定键通常是一个原子,但它可能是在不同上下文中定义的变量的元组。

实例

iex> Code.eval_string("a + b", [a: 1, b: 2], file: __ENV__.file, line: __ENV__.line) {3, [a: 1, b: 2]} iex> Code.eval_string("c = a + b", [a: 1, b: 2], __ENV__) {3, [a: 1, b: 2, c: 3]} iex> Code.eval_string("a = a + b", [a: 1, b: 2]) {3, [a: 3, b: 2]}

为方便起见,您可以传递__ENV __ / 0作为opts参数,并且当前环境中定义的所有导入,要求和别名将自动结束:

iex> Code.eval_string("a + b", [a: 1, b: 2], __ENV__) {3, [a: 1, b: 2]}

get_docs(module, kind)

返回给定模块的文档。

当给定模块名称时,它会找到它的BEAM代码并从中读取文档。

给出.beam文件的路径时,它将直接从该文件加载文档。

返回值取决于kind值:

  • :docs- 使用该@doc属性附加到函数和宏的所有文档字符串的列表

  • :moduledoc- 元组{<line>, <doc>}其中line是模块定义开始的行,并且doc是使用该@moduledoc属性附加到模块的字符串

  • :callback_docs- 附加到@callbacks使用该@doc属性的所有文档字符串列表

  • :type_docs- @type使用该@typedoc属性附加到回调的所有文档字符串列表

:all - 包含以下内容的关键字列表:docs和:moduledoc,:callback_docs和:type_docs.如果无法找到该模块,则返回nil.Examples#获取模块文档

  • :file- 在堆栈跟踪中使用的文件名和在__ENV__/0宏中报告的文件

  • :行 - 在__ENV __ / 0宏中报告的行

  • :existing_atoms_only - 如果为true,则在标记器找到不存在的原子时引发错误

Macro.to_string / 2

将字符串Macro.to_string/2转换为引用形式的反义词是将引用的表单转换为字符串/二进制表示形式。

string_to_quoted!(string, opts \ [])

将给定的字符串转换为其引用形式。

如果成功则返回ast,否则引发异常。 如果令牌丢失(通常是因为表达式不完整),则为TokenMissingError,否则为SyntaxError。

检查string_to_quoted/2选项信息。

unload_files(files)

从加载的文件列表中删除文件。

文件中定义的模块不会被删除; 调用此函数只会将它们从列表中删除,从而使它们再次被需要。

实例

# Load EEx test code, unload file, check for functions still available Code.load_file("../eex/test/eex_test.exs") Code.unload_files(Code.loaded_files) function_exported?(EExTest.Compiled, :before_compile, 0) #=> true