YSTest: NPL::A1::Forms 命名空间参考

YSTest PreAlpha_b900_20201012 The YSLib Test Project

命名空间 | 类 | 函数
NPL::A1::Forms 命名空间参考

NPLA1 语法形式对应的功能实现。 更多...

## 命名空间

| Ground

## 类

struct | BinaryAsExpansion
struct | BinaryExpansion
struct | UnaryAsExpansion
struct | UnaryExpansion
| 保存函数展开调用的函数对象。 更多...

## 函数

YB_ATTR_nodiscard YF_API YB_PURE bool | IsSymbol (const string &) ynothrow
| 判断字符串值是否可构成符号。 更多...
YB_ATTR_nodiscard YF_API YB_PURE TokenValue | StringToSymbol (const string &)
| 创建等于指定字符串值的记号值。 更多...
YB_ATTR_nodiscard YF_API YB_PURE TokenValue | StringToSymbol (string &&)
YB_ATTR_nodiscard YF_API YB_STATELESS const string & | SymbolToString (const TokenValue &) ynothrow
| 取符号对应的名称字符串。 更多...
| PDefH (ReductionStatus, Retain, const TermNode &term) ynothrowv ImplRet(AssertBranch(term)
| 保留项：保留求值。 更多...
ReductionStatus::Retained YF_API size_t | RetainN (const TermNode &, size_t=1)
| 保留经检查确保具有指定个数参数的项：保留求值。 更多...
template<typename _func , typename... _tParams>
auto | CallRawUnary (_func &&f, TermNode &term, _tParams &&... args) -> yimpl(decltype(ystdex::expand_proxy< void(TermNode &, _tParams &&...)> ::call(f, NPL::Deref(std::next(term.begin())), yforward(args)...)))
| 访问节点的子节点并调用一元函数。 更多...
template<typename _func >
auto | CallResolvedUnary (_func &&f, TermNode &term) -> yimpl(decltype(NPL::ResolveTerm(yforward(f), term)))
| 解析节点的子节点并调用一元函数。 更多...
template<typename _type , typename _func , typename... _tParams>
auto | CallResolvedUnaryAs (_func &&f, TermNode &term, _tParams &&... args) -> yimpl(decltype(ystdex::expand_proxy< void(_type &, const ResolvedTermReferencePtr &, _tParams &&...)>::call(f, NPL::Access< _type >(term), ResolvedTermReferencePtr(), std::forward< _tParams >(args)...)))
template<typename _type , typename _func , typename... _tParams>
auto | CallRegularUnaryAs (_func &&f, TermNode &term, _tParams &&... args) -> yimpl(decltype(ystdex::expand_proxy< void(_type &, const ResolvedTermReferencePtr &, _tParams &&...)>::call(f, NPL::Access< _type >(term), ResolvedTermReferencePtr(), std::forward< _tParams >(args)...)))
template<typename _func , typename... _tParams>
void | CallUnary (_func &&f, TermNode &term, _tParams &&... args)
| 访问节点并调用一元函数。 更多...
template<typename _type , typename _func , typename... _tParams>
void | CallUnaryAs (_func &&f, TermNode &term, _tParams &&... args)
template<typename _func , typename... _tParams>
void | CallBinary (_func &&f, TermNode &term, _tParams &&... args)
| 访问节点并调用二元函数。 更多...
template<typename _type , typename _type2 , typename _func , typename... _tParams>
void | CallBinaryAs (_func &&f, TermNode &term, _tParams &&... args)
template<typename _type , typename _func , typename... _tParams>
void | CallBinaryFold (_func f, _type val, TermNode &term, _tParams &&... args)
| 访问节点并以指定的初始值为基础逐项调用二元函数。 更多...
template<size_t _vWrapping = Strict, typename _func , class _tTarget >
void | RegisterUnary (_tTarget &target, string_view name, _func f)
| 注册一元严格求值上下文处理器。 更多...
template<size_t _vWrapping = Strict, typename _type , typename _func , class _tTarget >
void | RegisterUnary (_tTarget &target, string_view name, _func f)
template<size_t _vWrapping = Strict, typename _func , class _tTarget >
void | RegisterBinary (_tTarget &target, string_view name, _func f)
| 注册二元严格求值上下文处理器。 更多...
template<size_t _vWrapping = Strict, typename _type , typename _type2 , typename _func , class _tTarget >
void | RegisterBinary (_tTarget &target, string_view name, _func f)
YF_API void | Equal (TermNode &)
| 比较两个子项表示的值引用相同的对象。 更多...
YF_API void | EqualLeaf (TermNode &)
| 比较两个子项的值相等。 更多...
YF_API void | EqualReference (TermNode &)
| 比较两个子项的值引用相同的对象。 更多...
YF_API void | EqualValue (TermNode &)
| 比较两个子项表示的值相等。 更多...
YF_API ReductionStatus | If (TermNode &, ContextNode &)
| 分支判断：根据求值的条件选取表达式求值。 更多...
YF_API ReductionStatus | Cond (TermNode &, ContextNode &)
| 条件分支选择：根据条件列表顺序选取第一个符合其中条件对应的表达式求值。 更多...
YF_API ReductionStatus | When (TermNode &, ContextNode &)
| 条件顺序求值：预期条件成立。 更多...
YF_API ReductionStatus | Unless (TermNode &, ContextNode &)
| 条件顺序求值：预期条件不成立。 更多...
YF_API YB_PURE bool | Not (TermNode &)
| 逻辑非。 更多...
YF_API ReductionStatus | And (TermNode &, ContextNode &)
| 支持短路求值的逻辑与。 更多...
YF_API ReductionStatus | Or (TermNode &, ContextNode &)
| 支持短路求值的逻辑或。 更多...
YF_API ReductionStatus | Cons (TermNode &)
| 接受两个参数，返回以第一参数作为第一个元素插入第二参数创建的新的列表。 更多...
YF_API ReductionStatus | ConsRef (TermNode &)
YF_API ReductionStatus | ForwardListFirst (TermNode &, ContextNode &)
| 取列表的第一元素并转发给指定的应用子。 更多...
YF_API ReductionStatus | First (TermNode &)
| 取参数指定的列表中的第一元素的引用值。 更多...
YF_API ReductionStatus | FirstAt (TermNode &)
YF_API ReductionStatus | FirstRef (TermNode &)
YF_API ReductionStatus | FirstVal (TermNode &)
YF_API void | SetFirst (TermNode &)
| 修改第一参数指定的列表以第二参数作为第一个元素。 更多...
YF_API void | SetFirstAt (TermNode &)
YF_API void | SetFirstRef (TermNode &)
YF_API void | SetRest (TermNode &)
| 修改第一参数指定的列表以第二参数作为第一个元素外的列表。 更多...
YF_API void | SetRestRef (TermNode &)
YF_API ReductionStatus | Eval (TermNode &, ContextNode &)
| 对指定项以指定的环境求值。 更多...
YF_API ReductionStatus | EvalRef (TermNode &, ContextNode &)
YF_API ReductionStatus | EvalString (TermNode &, ContextNode &)
| 在参数指定的环境中求值作为外部表示的字符串。 更多...
YF_API ReductionStatus | EvalStringRef (TermNode &, ContextNode &)
| 在参数指定的环境中求值作为外部表示的字符串。 更多...
YF_API ReductionStatus | EvalUnit (TermNode &)
| 在参数指定的 REPL 环境中规约字符串表示的翻译单元以求值。 更多...
YF_API void | MakeEnvironment (TermNode &)
| 创建以参数指定的环境列表作为父环境的新环境。 更多...
YF_API void | GetCurrentEnvironment (TermNode &, ContextNode &)
| 取当前环境的引用。 更多...
YF_API void | LockCurrentEnvironment (TermNode &, ContextNode &)
| 锁定当前环境的引用。 更多...
YF_API ReductionStatus | ValueOf (TermNode &, const ContextNode &)
| 求值标识符得到指称的实体。 更多...
YF_API ReductionStatus | DefineLazy (TermNode &, ContextNode &)
| 以惰性求值的表达式定义值。 更多...
YF_API ReductionStatus | DefineWithNoRecursion (TermNode &, ContextNode &)
| 不带递归匹配的定义。 更多...
YF_API ReductionStatus | DefineWithRecursion (TermNode &, ContextNode &)
| 带递归匹配的定义。 更多...
YF_API ReductionStatus | SetWithNoRecursion (TermNode &, ContextNode &)
| 修改指定环境的绑定，不带递归匹配。 更多...
YF_API ReductionStatus | SetWithRecursion (TermNode &, ContextNode &)
| 修改指定环境的绑定，带递归匹配。 更多...
YF_API void | Undefine (TermNode &, ContextNode &)
| 移除定义引入的绑定。 更多...
YF_API void | UndefineChecked (TermNode &, ContextNode &)
| 检查并移除名称绑定。 更多...
YF_API ReductionStatus | Lambda (TermNode &, ContextNode &)
| λ 抽象：求值为一个捕获当前上下文的严格求值的函数。 更多...
YF_API ReductionStatus | LambdaRef (TermNode &, ContextNode &)
YF_API ReductionStatus | Vau (TermNode &, ContextNode &)
| vau 抽象：求值为一个捕获当前上下文的非严格求值的函数。 更多...
YF_API ReductionStatus | VauRef (TermNode &, ContextNode &)
YF_API ReductionStatus | VauWithEnvironment (TermNode &, ContextNode &)
| 带环境的 vau 抽象：求值为一个捕获当前上下文的非严格求值的函数。 更多...
YF_API ReductionStatus | VauWithEnvironmentRef (TermNode &, ContextNode &)
YF_API ReductionStatus | Wrap (TermNode &, ContextNode &)
| 包装合并子为应用子。 更多...
YF_API ReductionStatus | WrapRef (TermNode &, ContextNode &)
| 包装合并子为应用子。 更多...
YF_API ReductionStatus | WrapOnce (TermNode &, ContextNode &)
| 包装操作子为应用子。 更多...
YF_API ReductionStatus | WrapOnceRef (TermNode &, ContextNode &)
| 包装操作子为应用子。 更多...
YF_API ReductionStatus | Unwrap (TermNode &, ContextNode &)
| 解包装应用子为合并子。 更多...
YF_API ReductionStatus | CheckEnvironment (TermNode &)
| 检查参数指定的项表示环境。 更多...
YF_API ReductionStatus | CheckListReference (TermNode &)
| 检查参数指定的项表示非空列表的引用。 更多...
YF_API ReductionStatus | MakeEncapsulationType (TermNode &)
| 创建封装类型。 更多...
YF_API ReductionStatus | Sequence (TermNode &, ContextNode &)
| 序列有序参数规约：移除第一项后顺序规约子项，结果为最后一个子项的规约结果。 更多...
YF_API ReductionStatus | Apply (TermNode &, ContextNode &)
| 函数应用：应用参数指定的函数和作为函数参数的列表。 更多...
YF_API ReductionStatus | ListAsterisk (TermNode &)
| 使用可选的参数指定的不定数量的元素和结尾列表构造新列表。 更多...
YF_API ReductionStatus | ListAsteriskRef (TermNode &)
YF_API ReductionStatus | AccL (TermNode &, ContextNode &)
| 在抽象列表元素上应用左结合的二元操作。 更多...
YF_API ReductionStatus | AccR (TermNode &, ContextNode &)
| 在抽象列表元素上应用右结合的二元操作。 更多...
YF_API ReductionStatus | FoldR1 (TermNode &, ContextNode &)
| 在列表元素上应用右结合的二元操作。 更多...
YF_API ReductionStatus | Map1 (TermNode &, ContextNode &)
| 单列表映射操作。 更多...
YF_API void | CallSystem (TermNode &)
| 调用 UTF-8 字符串的系统命令，并保存 int 类型的结果到项的值中。 更多...
void | LoadGroundContext (REPLContext &context)
void | LoadModule_std_environments (REPLContext &context)
void | LoadModule_std_promises (REPLContext &context)
void | LoadModule_std_strings (REPLContext &context)
void | LoadModule_std_io (REPLContext &context)
void | LoadModule_std_system (REPLContext &context)
void | LoadModule_SHBuild (REPLContext &context)
void | LoadStandardContext (REPLContext &context)

## 详细描述

NPLA1 语法形式对应的功能实现。

前置条件
  除非另行指定支持保存当前动作，若存在子项，关联的上下文中的尾动作为空。
  设置为处理器调用的操作在进入调用前应确保设置尾上下文等内部状态。
  作为操作数的项的子项不包含引用或非正规表示引入的对操作数内的子项的循环引用。

自从
  build 732

提供支持 NPLA1 对象语言文法的操作的接口。 提供的操作用于实现操作子或应用子底层的操作子。 除非另行指定，操作子的参数被通过直接转移项的形式转发。

## 函数说明

## ◆ AccL()

ReductionStatus NPL::A1::Forms::AccL | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

在抽象列表元素上应用左结合的二元操作。

自从
  build 898

对 <object1> 指定的抽象列表进行处理，取得部分和。 当谓词 <predicate> 对列表应用结果不为假时，处理的结果为参数 <object2> 指定的对象； 否则，继续处理抽象列表中余下的元素。 处理抽象的列表的操作通过余下的应用子分别定义： 取列表头、取列表尾和部分和的二元合并操作。

参考调用文法：

    accl <object1> <predicate> <object2> <applicative1>

    <applicative2> <applicative3>

在文件 NPLA1Forms.cpp 第 2644 行定义.

引用了 next, RetainN() , 以及 NPL::A1::Internals::term.

函数调用图:

## ◆ AccR()

ReductionStatus NPL::A1::Forms::AccR | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

在抽象列表元素上应用右结合的二元操作。

参考调用文法：

    accr <object1> <predicate> <object2> <applicative1>

    <applicative2> <applicative3>

在文件 NPLA1Forms.cpp 第 2661 行定义.

引用了 ystdex::cpp2014::exchange(), next, RetainN() , 以及 NPL::A1::Internals::term.

函数调用图:

## ◆ And()

ReductionStatus NPL::A1::Forms::And | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

支持短路求值的逻辑与。

注解
  支持保存当前动作。

参见
  ReduceOnce

自从
  build 754

非严格求值若干个子项，返回求值结果的逻辑与： 除第一个子项，没有其它子项时，返回 true ；否则从左到右逐个求值子项。 当子项全求值为 true 时返回最后一个子项的值，否则返回 false 。

参考调用文法：

    $and? <test>...

在文件 NPLA1Forms.cpp 第 2113 行定义.

引用了 NPL::A1::Internals::term.

## ◆ Apply()

ReductionStatus NPL::A1::Forms::Apply | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

函数应用：应用参数指定的函数和作为函数参数的列表。

自从
  build 859

结果是对解包装的应用子应用参数的函数值。保留结果中的引用值。

参考调用文法：

    apply <applicative> <object> <environment>
    apply <applicative> <object>

在文件 NPLA1Forms.cpp 第 2613 行定义.

引用了 NPL::AllocateEnvironment(), next, NPL::ResolveEnvironment(), size, NPL::A1::Internals::term , 以及 NPL::A1::ThrowInvalidSyntaxError().

函数调用图:

## ◆ CallBinary()

template<typename _func , typename... _tParams>

void NPL::A1::Forms::CallBinary | ( | _func && | f,
|  | TermNode & | term,
|  | _tParams &&... | args
| ) |  |

访问节点并调用二元函数。

自从
  build 760

在文件 NPLA1Forms.h 第 257 行定义.

引用了 YSLib::_tParams, NPL::A1::args, platform::Deref(), YSLib::EmplaceCallResult(), CHRLib::f(), YSLib::i, ystdex::invoke_nonvoid(), ystdex::ref(), RetainN(), NPL::A1::Internals::term, x , 以及 yforward.

函数调用图:

## ◆ CallBinaryAs()

template<typename _type , typename _type2 , typename _func , typename... _tParams>

void NPL::A1::Forms::CallBinaryAs | ( | _func && | f,
|  | TermNode & | term,
|  | _tParams &&... | args
| ) |  |

自从
  build 835

在文件 NPLA1Forms.h 第 273 行定义.

引用了 YSLib::_tParams, ystdex::details::_type2, NPL::A1::args, platform::Deref(), YSLib::EmplaceCallResult(), CHRLib::f(), YSLib::i, ystdex::invoke_nonvoid(), ystdex::ref(), RetainN(), NPL::A1::Internals::term, x , 以及 yforward.

函数调用图:

## ◆ CallBinaryFold()

template<typename _type , typename _func , typename... _tParams>

void NPL::A1::Forms::CallBinaryFold | ( | _func | f,
|  | _type | val,
|  | TermNode & | term,
|  | _tParams &&... | args
| ) |  |

访问节点并以指定的初始值为基础逐项调用二元函数。

注解
  为支持 std::bind 推断类型，和以上函数的情形不同，不支持省略参数。

自从
  build 758

在文件 NPLA1Forms.h 第 296 行定义.

引用了 NPL::A1::args, ystdex::bind1(), platform::Deref(), YSLib::EmplaceCallResult(), CHRLib::f(), YSLib::i, next, NPL::A1::Internals::term , 以及 yforward.

被这些函数引用 LoadModule_std_strings().

函数调用图:
这是这个函数的调用关系图:

## ◆ CallRawUnary()

template<typename _func , typename... _tParams>

auto NPL::A1::Forms::CallRawUnary | ( | _func && | f,
|  | TermNode & | term,
|  | _tParams &&... | args
| ) |  | -> yimpl(decltype(ystdex::expand_proxy<void(TermNode&, _tParams&&...)> ::call(f, NPL::Deref(std::next(term.begin())), yforward(args)...)))

inline

访问节点的子节点并调用一元函数。

自从
  build 855

在文件 NPLA1Forms.h 第 136 行定义.

引用了 YSLib::_tParams, NPL::A1::args, platform::Deref(), CHRLib::f(), next, RetainN(), NPL::A1::Internals::term, yforward , 以及 NPL::yimpl().

被这些函数引用 CallResolvedUnary() , 以及 CallUnary().

函数调用图:
这是这个函数的调用关系图:

## ◆ CallRegularUnaryAs()

template<typename _type , typename _func , typename... _tParams>

auto NPL::A1::Forms::CallRegularUnaryAs | ( | _func && | f,
|  | TermNode & | term,
|  | _tParams &&... | args
| ) |  | -> yimpl(decltype(ystdex::expand_proxy<void(_type&, const ResolvedTermReferencePtr&, _tParams&&...)>::call(f, NPL::Access<_type>( term), ResolvedTermReferencePtr(), std::forward<_tParams>(args)...)))

inline

注解
  访问节点的子节点，以正规值调用一元函数。

参见
  NPL::AccessRegular

异常

  ListTypeError | 异常中立：项为列表项。

在文件 NPLA1Forms.h 第 188 行定义.

引用了 YSLib::_tParams, NPL::AccessRegular(), NPL::A1::args, ystdex::expand_proxy< _fCallable, _vLen >::call(), CallResolvedUnary(), CHRLib::f(), NPL::A1::Internals::term , 以及 NPL::yimpl().

函数调用图:

## ◆ CallResolvedUnary()

template<typename _func >

auto NPL::A1::Forms::CallResolvedUnary | ( | _func && | f,
|  | TermNode & | term
| ) |  | -> yimpl(decltype(NPL::ResolveTerm(yforward(f), term)))

inline

解析节点的子节点并调用一元函数。

在文件 NPLA1Forms.h 第 148 行定义.

引用了 CallRawUnary(), CHRLib::f(), NPL::ResolveTerm(), NPL::A1::Internals::term, NPL::A1::tm, yforward , 以及 NPL::yimpl().

被这些函数引用 CallRegularUnaryAs(), CallResolvedUnaryAs() , 以及 CheckListReference().

函数调用图:
这是这个函数的调用关系图:

## ◆ CallResolvedUnaryAs()

template<typename _type , typename _func , typename... _tParams>

auto NPL::A1::Forms::CallResolvedUnaryAs | ( | _func && | f,
|  | TermNode & | term,
|  | _tParams &&... | args
| ) |  | -> yimpl(decltype(ystdex::expand_proxy<void(_type&, const ResolvedTermReferencePtr&, _tParams&&...)>::call(f, NPL::Access<_type>( term), ResolvedTermReferencePtr(), std::forward<_tParams>(args)...)))

inline

异常

  bad_any_cast | 异常中立：非列表项类型检查失败。

自从
  build 859

在文件 NPLA1Forms.h 第 162 行定义.

引用了 YSLib::_tParams, NPL::A1::args, ystdex::expand_proxy< _fCallable, _vLen >::call(), CallResolvedUnary(), CHRLib::f(), NPL::A1::Internals::term , 以及 NPL::yimpl().

函数调用图:

## ◆ CallSystem()

void NPL::A1::Forms::CallSystem | ( | TermNode & | term | ) |

调用 UTF-8 字符串的系统命令，并保存 int 类型的结果到项的值中。

参见
  usystem

自从
  build 741

参考调用文法：

    system <string>

在文件 NPLA1Forms.cpp 第 2696 行定义.

引用了 NPL::c_str(), ystdex::compose(), NPL::A1::Internals::term , 以及 platform::usystem().

被这些函数引用 LoadModule_std_system().

函数调用图:
这是这个函数的调用关系图:

## ◆ CallUnary()

template<typename _func , typename... _tParams>

void NPL::A1::Forms::CallUnary | ( | _func && | f,
|  | TermNode & | term,
|  | _tParams &&... | args
| ) |  |

访问节点并调用一元函数。

注解
  确定项具有一个实际参数后展开调用参数指定的函数。

若被调用的函数返回类型非 void ，返回值作为项的值被构造。 调用 YSLib::EmplaceCallResult 对 ValueObject 及引用值处理不同。 若需以和其它类型的值类似的方式被包装，在第一参数中构造 ValueObject 对象。 实现使用 ystdex::make_expanded 展开调用，但不复制或转移可调用对象， 因此使用 std::ref 包装第一参数。注意当前无条件视第一参数为 const 左值。 考虑一般实现的性能不确定性，当前实现中，调用 YSLib::EmplaceCallResult 不使用分配器。

参见
  YSLib::EmplaceCallResult

自从
  build 756

在文件 NPLA1Forms.h 第 228 行定义.

引用了 YSLib::_tParams, NPL::A1::args, CallRawUnary(), YSLib::EmplaceCallResult(), CHRLib::f(), ystdex::invoke_nonvoid(), ystdex::ref(), NPL::A1::Internals::term, NPL::A1::tm , 以及 yforward.

被这些函数引用 CallUnaryAs().

函数调用图:
这是这个函数的调用关系图:

## ◆ CallUnaryAs()

template<typename _type , typename _func , typename... _tParams>

void NPL::A1::Forms::CallUnaryAs | ( | _func && | f,
|  | TermNode & | term,
|  | _tParams &&... | args
| ) |  |

在文件 NPLA1Forms.h 第 239 行定义.

引用了 YSLib::_tParams, NPL::A1::args, CallUnary(), CHRLib::f(), ystdex::ref(), NPL::A1::Internals::term , 以及 NPL::A1::tm.

函数调用图:

## ◆ CheckEnvironment()

ReductionStatus NPL::A1::Forms::CheckEnvironment | ( | TermNode & | term | ) |

检查参数指定的项表示环境。

自从
  build 859

返回
  ReductionStatus::Regular 。

异常

  TypeError | 检查失败：参数指定的项不表示环境。
  ListTypeError | 检查失败：参数指定的项表示列表。

对参数指定的项进行检查。 接受对象语言的一个参数。若这个参数不表示环境，抛出异常； 否则，对象语言中返回为参数指定的值。

参考调用文法：

    check-environment <object>

在文件 NPLA1Forms.cpp 第 2550 行定义.

引用了 NPL::MoveRValueToReturn(), next, NPL::ResolveEnvironment(), RetainN(), NPL::A1::Internals::term , 以及 NPL::tm.

函数调用图:

## ◆ CheckListReference()

ReductionStatus NPL::A1::Forms::CheckListReference | ( | TermNode & | term | ) |

检查参数指定的项表示非空列表的引用。

异常

  ListTypeError | 检查失败：参数指定的项不表示非空列表。

自从
  build 857

对参数指定的项进行检查。 接受对象语言的一个参数。若这个参数不表示非空列表引用值，抛出异常； 否则，对象语言中返回为参数指定的值。

参考调用文法：

    check-list-reference <object>

在文件 NPLA1Forms.cpp 第 2562 行定义.

引用了 CallResolvedUnary(), platform::Deref(), next , 以及 NPL::A1::Internals::term.

函数调用图:

## ◆ Cond()

ReductionStatus NPL::A1::Forms::Cond | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

条件分支选择：根据条件列表顺序选取第一个符合其中条件对应的表达式求值。

自从
  build 860

参考调用文法：

    $cond <clauses>...

在文件 NPLA1Forms.cpp 第 2072 行定义.

引用了 platform::Deref(), YSLib::i, NPL::A1::ReduceOnce(), YSLib::RemoveHead() , 以及 NPL::A1::Internals::term.

函数调用图:

## ◆ Cons()

ReductionStatus NPL::A1::Forms::Cons | ( | TermNode & | term | ) |

接受两个参数，返回以第一参数作为第一个元素插入第二参数创建的新的列表。

返回
  ReductionStatus::Retained 。

异常

  ListTypeError | 第二参数不是列表。

注解
  NPLA 无 cons 对，所以要求创建的总是列表。

参见
  LiftSubtermsToReturn

自从
  build 779

按值传递返回值。构造的对象中的元素转换为右值。 替代引用值通过 NPL::LiftSubtermsToReturn(@6.6.2) 提升求值后的项的每个子项实现。

参考调用文法：

    cons <object> <list>

在文件 NPLA1Forms.cpp 第 2126 行定义.

引用了 NPL::A1::Internals::term.

## ◆ ConsRef()

ReductionStatus NPL::A1::Forms::ConsRef | ( | TermNode & | term | ) |

自从
  build 822

在返回时不提升项，允许返回引用。

参考调用文法：

    cons% <object> <list>

在文件 NPLA1Forms.cpp 第 2134 行定义.

引用了 NPL::A1::Internals::term.

## ◆ DefineLazy()

ReductionStatus NPL::A1::Forms::DefineLazy | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

以惰性求值的表达式定义值。

异常

  ParameterMismatch | 绑定匹配失败。
  InvalidSyntax | 绑定的源为空。

参见
  BindParameter
  Vau

自从
  build 840

实现修改环境的特殊形式。 使用 <definiend> 指定绑定目标，和 Vau 的 <formals> 格式相同。 剩余表达式 <expressions> 指定绑定的源。 返回未指定值。 限定第三参数后可使用 RegisterForm 注册上下文处理器。

注解
  不对剩余表达式进一步求值。

剩余表达式视为求值结果，直接绑定到 `<definiend>` 。

参考调用文法：

    $deflazy! <definiend> <expressions>

在文件 NPLA1Forms.cpp 第 2419 行定义.

引用了 ystdex::ref() , 以及 NPL::A1::Internals::term.

函数调用图:

## ◆ DefineWithNoRecursion()

ReductionStatus NPL::A1::Forms::DefineWithNoRecursion | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

不带递归匹配的定义。

剩余表达式视为一个表达式在上下文决定的当前环境进行求值后绑定到 `<definiend>` 。

参考调用文法：

    $def! <definiend> <expressions>

在文件 NPLA1Forms.cpp 第 2427 行定义.

引用了 NPL::A1::Internals::term.

## ◆ DefineWithRecursion()

ReductionStatus NPL::A1::Forms::DefineWithRecursion | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

带递归匹配的定义。

注解
  支持直接递归和互相递归绑定。

参见
  InvalidReference

分阶段解析可能递归绑定的名称。 剩余表达式视为一个表达式，在上下文决定的当前环境进行求值后绑定到 `<definiend>` 。 常规绑定前后遍历被绑定的操作数树以支持强递归绑定。不存在的操作数被绑定为中间值。 循环引用以此引入的名称可能抛出 InvalidReference 异常。

参考调用文法：

    $defrec! <definiend> <expressions>

在文件 NPLA1Forms.cpp 第 2433 行定义.

引用了 NPL::A1::Internals::term.

## ◆ Equal()

void NPL::A1::Forms::Equal | ( | TermNode & | term | ) |

比较两个子项表示的值引用相同的对象。

参见
  YSLib::HoldSame

自从
  build 804

参考调用文法：

    eq? <object1> <object2>

在文件 NPLA1Forms.cpp 第 2022 行定义.

引用了 NPL::A1::Internals::term.

## ◆ EqualLeaf()

void NPL::A1::Forms::EqualLeaf | ( | TermNode & | term | ) |

比较两个子项的值相等。

参见
  YSLib::ValueObject

自从
  build 804

参考调用文法：

    eql? <object1> <object2>

在文件 NPLA1Forms.cpp 第 2028 行定义.

引用了 NPL::A1::Internals::term.

## ◆ EqualReference()

void NPL::A1::Forms::EqualReference | ( | TermNode & | term | ) |

比较两个子项的值引用相同的对象。

自从
  build 748

参见
  YSLib::HoldSame

参考调用文法：

    eqr? <object1> <object2>

在文件 NPLA1Forms.cpp 第 2034 行定义.

引用了 NPL::A1::Internals::term.

## ◆ EqualValue()

void NPL::A1::Forms::EqualValue | ( | TermNode & | term | ) |

比较两个子项表示的值相等。

参见
  YSLib::ValueObject

参考调用文法：

    eqv? <object1> <object2>

在文件 NPLA1Forms.cpp 第 2040 行定义.

引用了 NPL::A1::Internals::term.

## ◆ Eval()

ReductionStatus NPL::A1::Forms::Eval | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

对指定项以指定的环境求值。

注解
  支持保存当前动作。

参见
  ResolveEnvironment

以表达式 `<expression>` 和环境 `<environment>` 为指定的参数进行求值。 环境以 ContextNode 的引用表示。

自从
  build 787

按值传递返回值：提升求值后的项。

参考调用文法：

    eval <expression> <environment>

在文件 NPLA1Forms.cpp 第 2313 行定义.

引用了 NPL::A1::Internals::term.

## ◆ EvalRef()

ReductionStatus NPL::A1::Forms::EvalRef | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

自从
  build 822

不提升求值后的项，允许返回引用值。

参考调用文法：

    eval% <expression> <environment>

在文件 NPLA1Forms.cpp 第 2319 行定义.

引用了 NPL::A1::Internals::term.

## ◆ EvalString()

ReductionStatus NPL::A1::Forms::EvalString | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

在参数指定的环境中求值作为外部表示的字符串。

自从
  build 835

返回
  ReductionStatus::Retained 。

注解
  没有 REPL 中的预处理过程。

参见
  Eval

参考调用文法：

    eval-string <string> <environment>

在文件 NPLA1Forms.cpp 第 2325 行定义.

引用了 NPL::A1::Internals::term.

被这些函数引用 LoadModule_std_environments().

这是这个函数的调用关系图:

## ◆ EvalStringRef()

ReductionStatus NPL::A1::Forms::EvalStringRef | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

在参数指定的环境中求值作为外部表示的字符串。

注解
  没有 REPL 中的预处理过程。

参见
  EvalRef

不提升求值后的项，允许返回引用值。

参考调用文法：

    eval-string% <string> <environment>

在文件 NPLA1Forms.cpp 第 2331 行定义.

引用了 NPL::A1::Internals::term.

被这些函数引用 LoadModule_std_environments().

这是这个函数的调用关系图:

## ◆ EvalUnit()

ReductionStatus NPL::A1::Forms::EvalUnit | ( | TermNode & | term | ) |

在参数指定的 REPL 环境中规约字符串表示的翻译单元以求值。

异常

  LoggedEvent | 翻译单元为空串。

参见
  Reduce

自从
  build 835

提供创建 REPL 新实例并求值的便利接口。

参考调用文法：

    eval-unit <string> <object>

在文件 NPLA1Forms.cpp 第 2337 行定义.

引用了 NPL::A1::REPLContext::Perform() , 以及 NPL::A1::Internals::term.

被这些函数引用 LoadModule_std_environments().

函数调用图:
这是这个函数的调用关系图:

## ◆ First()

ReductionStatus NPL::A1::Forms::First | ( | TermNode & | term | ) |

取参数指定的列表中的第一元素的引用值。

自从
  build 859

转发参数的元素和函数值。

参考调用文法：

    first <list>

在文件 NPLA1Forms.cpp 第 2197 行定义.

引用了 First(), NPL::LiftOtherOrCopy(), platform::p, NPL::ReduceToReference(), NPL::ReduceToReferenceAt, NPL::A1::Internals::term , 以及 NPL::tm.

被这些函数引用 First().

函数调用图:
这是这个函数的调用关系图:

## ◆ FirstAt()

ReductionStatus NPL::A1::Forms::FirstAt | ( | TermNode & | term | ) |

异常

  ValueCategoryMismatch | 参数不是引用值。

自从
  build 873

结果是列表的第一个元素的引用值。保留结果中未折叠的引用值。

参考调用文法：

    first@ <list>

在文件 NPLA1Forms.cpp 第 2248 行定义.

引用了 NPL::ReduceToReferenceAt , 以及 NPL::A1::Internals::term.

## ◆ FirstRef()

ReductionStatus NPL::A1::Forms::FirstRef | ( | TermNode & | term | ) |

结果是列表的第一个元素引用的对象的引用值。保留结果中的引用值。

参考调用文法：

    first& <list>

在文件 NPLA1Forms.cpp 第 2254 行定义.

引用了 NPL::ReduceToReference() , 以及 NPL::A1::Internals::term.

函数调用图:

## ◆ FirstVal()

ReductionStatus NPL::A1::Forms::FirstVal | ( | TermNode & | term | ) |

结果是列表的第一个元素经过返回值转换的值。不保留结果中的引用值。

参考调用文法：

    firstv <list>

在文件 NPLA1Forms.cpp 第 2260 行定义.

引用了 NPL::LiftOtherOrCopy(), platform::p, NPL::A1::Internals::term , 以及 NPL::tm.

函数调用图:

## ◆ FoldR1()

ReductionStatus NPL::A1::Forms::FoldR1 | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

在列表元素上应用右结合的二元操作。

自从
  build 899

对

当列表非空时，处理的结果为参数 <object> 指定的对象； 否则，继续处理列表中余下的元素。 参数 <applicative> 定义部分和的二元合并操作，应为列表构造器。 名称中的 1 指

参考调用文法：

    foldr1 <applicative> <object> <list>

在文件 NPLA1Forms.cpp 第 2677 行定义.

引用了 RetainN() , 以及 NPL::A1::Internals::term.

函数调用图:

## ◆ ForwardListFirst()

ReductionStatus NPL::A1::Forms::ForwardListFirst | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

取列表的第一元素并转发给指定的应用子。

异常

  ListTypeError | 参数不是非空列表。

自从
  build 875

使用第一参数指定的应用子调用第三参数指定的列表，取结果匹配的第一元素作为参数， 调用第二参数指定的应用子。 列表参数在对象语言中按引用传递。

参考调用文法：

    forward-list-first% <applicative1> <applicative2> <list>

在文件 NPLA1Forms.cpp 第 2141 行定义.

引用了 YSLib::a, CHRLib::c, CHRLib::d, YSLib::i, NPL::IsBranchedList, platform::l, NPL::A1::NameTypedReducerHandler(), ystdex::ref(), NPL::ResolveTerm(), RetainN(), NPL::A1::Internals::term, NPL::A1::ThrowInsufficientTermsError(), YSLib::vo, x , 以及 YB_FLATTEN.

函数调用图:

## ◆ GetCurrentEnvironment()

void NPL::A1::Forms::GetCurrentEnvironment | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

取当前环境的引用。

自从
  build 785

取得的宿主值类型为 weak_ptr<Environment> 。

参考调用文法：

    () get-current-environment

在文件 NPLA1Forms.cpp 第 2386 行定义.

引用了 RetainN(), NPL::A1::Internals::term , 以及 NPL::ContextNode::WeakenRecord.

函数调用图:

## ◆ If()

ReductionStatus NPL::A1::Forms::If | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

分支判断：根据求值的条件选取表达式求值。

注解
  测试条件成立，当且仅当 <test> 非 #f 。

参见
  ReduceOnce

自从
  build 750

求值第一参数作为测试条件，成立时取第二参数子项，否则当第三参数子项时取第三参数子项。 和 Kernel 不同而和 Scheme 类似，求值结果非 #f 的条件都成立，且支持省略第三操作数。

参考调用文法：

    $if <test> <consequent> <alternate>
    $if <test> <consequent>

在文件 NPLA1Forms.cpp 第 2047 行定义.

引用了 YSLib::i, NPL::A1::NameTypedReducerHandler(), next, NPL::A1::Internals::ReduceSubsequent(), size, NPL::A1::Internals::term , 以及 NPL::A1::ThrowInvalidSyntaxError().

函数调用图:

## ◆ IsSymbol()

bool NPL::A1::Forms::IsSymbol | ( | const string & | id | ) |

判断字符串值是否可构成符号。

自从
  build 779

参考调用文法：

    symbol-string? <object>

在文件 NPLA1Forms.cpp 第 1986 行定义.

## ◆ Lambda()

ReductionStatus NPL::A1::Forms::Lambda | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

λ 抽象：求值为一个捕获当前上下文的严格求值的函数。

异常

  InvalidSyntax | 语法错误：缺少项。
  InvalidSyntax | 语法错误：<formals> 不是形式参数树。
  ParameterMismatch | 异常中立：由 BindParameter 抛出。

参见
  EvaluateIdentifier
  ExtractParameters
  MatchParameter

警告
  返回闭包调用引用变量超出绑定目标的生存期引起未定义行为。

自从
  build 840

待办事项:
  优化捕获开销。

使用 ExtractParameters 检查参数列表并捕获和绑定变量， 然后设置节点的值为表示 λ 抽象的上下文处理器。 可使用 RegisterForm 注册上下文处理器。 和 Scheme 等不同，参数以项而不是位置的形式被转移，函数应用时可能有副作用。 按引用捕获上下文中的绑定。被捕获的上下文中的绑定依赖宿主语言的生存期规则。

捕获的静态环境由当前动态环境隐式确定。 不保留环境的所有权。

按值传递返回值：提升项。

参考调用文法：

    $lambda <formals> <body>

在文件 NPLA1Forms.cpp 第 2468 行定义.

引用了 NPL::A1::Internals::term.

## ◆ LambdaRef()

ReductionStatus NPL::A1::Forms::LambdaRef | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

在返回时不提升项，允许返回引用。

参考调用文法：

    $lambda% <formals> <body>

在文件 NPLA1Forms.cpp 第 2474 行定义.

引用了 NPL::A1::Internals::term.

## ◆ ListAsterisk()

ReductionStatus NPL::A1::Forms::ListAsterisk | ( | TermNode & | term | ) |

使用可选的参数指定的不定数量的元素和结尾列表构造新列表。

异常

  ParameterMismatch | 参数不是
  ListTypeError | 参数超过一个，且最后参数不是列表。

自从
  build 860

结果是构造的列表的值。不保留结果中的引用值。

参考调用文法：

    list* <object>+

在文件 NPLA1Forms.cpp 第 2629 行定义.

引用了 NPL::A1::Internals::term.

## ◆ ListAsteriskRef()

ReductionStatus NPL::A1::Forms::ListAsteriskRef | ( | TermNode & | term | ) |

结果是构造的列表的值。保留结果中的引用值。

参考调用文法：

    list*% <object>+

在文件 NPLA1Forms.cpp 第 2637 行定义.

引用了 NPL::A1::Internals::term.

## ◆ LoadGroundContext()

void NPL::A1::Forms::LoadGroundContext | ( | REPLContext & | context | ) |

在文件 Dependency.cpp 第 1009 行定义.

被这些函数引用 NPL::c_str() , 以及 LoadStandardContext().

这是这个函数的调用关系图:

## ◆ LoadModule_SHBuild()

void NPL::A1::Forms::LoadModule_SHBuild | ( | REPLContext & | context | ) |

在文件 Dependency.cpp 第 1232 行定义.

引用了 YSLib::a, NPL::AccessPtr(), ystdex::begins_with(), CHRLib::c, NPL::dst, CHRLib::e, YSLib::IO::EnsureDirectory, NPL::ContextNode::GetRecordRef(), YSLib::GetValuePtrOf(), YSLib::i, NPL::InstallHardLink(), YSLib::IO::IsAbsolute, ystdex::isspace(), platform::l, platform::omode_convb(), platform::p, pfx, ystdex::quote(), NPL::A1::RegisterStrict(), NPL::A1::REPLContext::Root, ystdex::split_l(), YSLib::Drawing::src, YSLib::Text::str, NPL::A1::Internals::term, platform::uopen(), YB_ATTR, ynothrow , 以及 yunused.

被这些函数引用 NPL::c_str().

函数调用图:
这是这个函数的调用关系图:

## ◆ LoadModule_std_environments()

void NPL::A1::Forms::LoadModule_std_environments | ( | REPLContext & | context | ) |

在文件 Dependency.cpp 第 1017 行定义.

引用了 platform::bool, NPL::A1::CheckSymbol(), EvalString(), EvalStringRef(), EvalUnit(), NPL::ContextNode::GetRecordRef(), NPL::A1::REPLContext::Perform(), NPL::A1::RegisterStrict(), RetainN(), NPL::A1::REPLContext::Root, NPL::A1::Internals::term , 以及 ValueOf().

被这些函数引用 NPL::c_str() , 以及 LoadStandardContext().

函数调用图:
这是这个函数的调用关系图:

## ◆ LoadModule_std_io()

void NPL::A1::Forms::LoadModule_std_io | ( | REPLContext & | context | ) |

在文件 Dependency.cpp 第 1146 行定义.

引用了 NPL::A1::REPLContext::CurrentSource, NPL::ContextNode::GetRecordRef(), NPL::A1::OpenUnique(), NPL::A1::ReduceToLoadExternal(), NPL::A1::RegisterStrict(), NPL::A1::RelayToLoadExternal(), RetainN(), NPL::A1::REPLContext::Root, YSLib::Text::str , 以及 NPL::A1::Internals::term.

被这些函数引用 NPL::c_str() , 以及 LoadStandardContext().

函数调用图:
这是这个函数的调用关系图:

## ◆ LoadModule_std_promises()

void NPL::A1::Forms::LoadModule_std_promises | ( | REPLContext & | context | ) |

在文件 Dependency.cpp 第 1043 行定义.

引用了 NPL::A1::REPLContext::Perform().

被这些函数引用 NPL::c_str() , 以及 LoadStandardContext().

函数调用图:
这是这个函数的调用关系图:

## ◆ LoadModule_std_strings()

void NPL::A1::Forms::LoadModule_std_strings | ( | REPLContext & | context | ) |

在文件 Dependency.cpp 第 1075 行定义.

引用了 CallBinaryFold(), NPL::ContextNode::GetRecordRef(), NPL::A1::RegisterStrict(), NPL::ResolveTerm(), NPL::A1::REPLContext::Root, YSLib::Text::str, NPL::A1::ThrowNonmodifiableErrorForAssignee(), x, YSLib::UI::y , 以及 ynothrow.

被这些函数引用 NPL::c_str() , 以及 LoadStandardContext().

函数调用图:
这是这个函数的调用关系图:

## ◆ LoadModule_std_system()

void NPL::A1::Forms::LoadModule_std_system | ( | REPLContext & | context | ) |

在文件 Dependency.cpp 第 1179 行定义.

引用了 CallSystem(), NPL::CheckLiteral(), YSLib::FetchCommandOutput(), YSLib::FetchEnvironmentVariable(), NPL::ContextNode::GetRecordRef(), YSLib::LockCommandArguments(), NPL::A1::REPLContext::Perform(), ystdex::quote(), NPL::A1::RegisterStrict(), RetainN(), NPL::A1::REPLContext::Root, platform::SetEnvironmentVariable(), ystdex::swap_dependent(), NPL::A1::Internals::term, ystdex::trim() , 以及 YSLib::Drawing::w.

被这些函数引用 NPL::c_str() , 以及 LoadStandardContext().

函数调用图:
这是这个函数的调用关系图:

## ◆ LoadStandardContext()

void NPL::A1::Forms::LoadStandardContext | ( | REPLContext & | context | ) |

在文件 Dependency.cpp 第 1387 行定义.

引用了 LoadGroundContext(), LoadModule_std_environments(), LoadModule_std_io(), LoadModule_std_promises(), LoadModule_std_strings(), LoadModule_std_system(), ystdex::ref() , 以及 NPL::A1::REPLContext::Root.

被这些函数引用 NPL::c_str().

函数调用图:
这是这个函数的调用关系图:

## ◆ LockCurrentEnvironment()

void NPL::A1::Forms::LockCurrentEnvironment | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

锁定当前环境的引用。

自从
  build 837

取得的宿主值类型为 shared_ptr<Environment> 。

参考调用文法：

    () lock-current-environment

在文件 NPLA1Forms.cpp 第 2393 行定义.

引用了 RetainN(), NPL::ContextNode::ShareRecord , 以及 NPL::A1::Internals::term.

函数调用图:

## ◆ MakeEncapsulationType()

ReductionStatus NPL::A1::Forms::MakeEncapsulationType | ( | TermNode & | term | ) |

创建封装类型。

返回
  ReductionStatus::Retained 。

自从
  build 834

创建封装类型操作的应用子。基本语义同 Kernel 的 make-encapsulation-type 。 构造器传递值：转移右值参数，或转换左值参数到右值并复制值进行封装。 访问器取得的是引用值。 用户代码需自行确定封装对象的生存期以避免访问取得的引用值引起未定义行为。

参考调用文法：

    () make-encapsulation-type

在文件 NPLA1Forms.cpp 第 2574 行定义.

引用了 YSLib::a, ystdex::allocate_shared(), NPL::AsTermNode(), p_type, NPL::A1::Internals::term , 以及 YSLib::yimpl().

函数调用图:

## ◆ MakeEnvironment()

void NPL::A1::Forms::MakeEnvironment | ( | TermNode & | term | ) |

创建以参数指定的环境列表作为父环境的新环境。

前置条件
  间接断言：第一参数指定的项是枝节点。

异常

  NPLException | 异常中立：由 Environment 的构造函数抛出。

参见
  Environment::CheckParent
  EnvironmentList

自从
  build 798

待办事项:
  使用专用的异常类型。

取以指定的参数初始化新创建的父环境。

参考调用文法：

    make-environment <environment>...

在文件 NPLA1Forms.cpp 第 2348 行定义.

引用了 YSLib::a, NPL::AllocateEnvironment(), YSLib::i, next, platform::p , 以及 NPL::A1::Internals::term.

函数调用图:

## ◆ Map1()

ReductionStatus NPL::A1::Forms::Map1 | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

单列表映射操作。

使用指定应用子对列表中每个参数进行调用，结果为调用结果的列表。

参考调用文法：

    map1 <applicative> <list>

在文件 NPLA1Forms.cpp 第 2686 行定义.

引用了 RetainN() , 以及 NPL::A1::Internals::term.

函数调用图:

## ◆ Not()

bool NPL::A1::Forms::Not | ( | TermNode & | term | ) |

逻辑非。

自从
  build 861

当子项求值为 true 时返回 false ，否则返回子项。

参考调用文法：

    not? <test>

在文件 NPLA1Forms.cpp 第 2105 行定义.

引用了 NPL::IsLeaf, NPL::A1::Internals::term , 以及 NPL::tm.

## ◆ Or()

ReductionStatus NPL::A1::Forms::Or | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

支持短路求值的逻辑或。

非严格求值若干个子项，返回求值结果的逻辑或： 除第一个子项，没有其它子项时，返回 false ；否则从左到右逐个求值子项。 当子项全求值为 false 时返回 false，否则返回第一个不是 false 的子项的值。

参考调用文法：

    $or? <test>...

在文件 NPLA1Forms.cpp 第 2119 行定义.

引用了 NPL::A1::Internals::term.

## ◆ PDefH()

NPL::A1::Forms::PDefH | ( | ReductionStatus | ,
|  | Retain | ,
|  | const TermNode & | term
| ) |  |

inline

保留项：保留求值。

前置条件
  断言：项或容器对应枝节点。

参见
  AssertBranch

自从
  build 733

注解
  保留求值留作保留用途，一般不需要被作为用户代码直接使用。
  只用于检查项的个数时，可忽略返回值。

自从
  build 765

可使用 RegisterForm 注册上下文处理器，参考文法： $retain|$retainN <expression>

## ◆ RegisterBinary() [1/2]

template<size_t _vWrapping = Strict, typename _func , class _tTarget >

void NPL::A1::Forms::RegisterBinary | ( | _tTarget & | target,
|  | string_view | name,
|  | _func | f
| ) |  |

inline

注册二元严格求值上下文处理器。

在文件 NPLA1Forms.h 第 481 行定义.

引用了 CHRLib::f() , 以及 NPL::A1::name.

函数调用图:

## ◆ RegisterBinary() [2/2]

template<size_t _vWrapping = Strict, typename _type , typename _type2 , typename _func , class _tTarget >

void NPL::A1::Forms::RegisterBinary | ( | _tTarget & | target,
|  | string_view | name,
|  | _func | f
| ) |  |

inline

在文件 NPLA1Forms.h 第 489 行定义.

引用了 CHRLib::f() , 以及 NPL::A1::name.

函数调用图:

## ◆ RegisterUnary() [1/2]

template<size_t _vWrapping = Strict, typename _func , class _tTarget >

void NPL::A1::Forms::RegisterUnary | ( | _tTarget & | target,
|  | string_view | name,
|  | _func | f
| ) |  |

inline

注册一元严格求值上下文处理器。

前置条件
  间接断言：第二参数的数据指针非空。

自从
  build 871

在文件 NPLA1Forms.h 第 462 行定义.

引用了 CHRLib::f() , 以及 NPL::A1::name.

函数调用图:

## ◆ RegisterUnary() [2/2]

template<size_t _vWrapping = Strict, typename _type , typename _func , class _tTarget >

void NPL::A1::Forms::RegisterUnary | ( | _tTarget & | target,
|  | string_view | name,
|  | _func | f
| ) |  |

inline

在文件 NPLA1Forms.h 第 470 行定义.

引用了 CHRLib::f() , 以及 NPL::A1::name.

函数调用图:

## ◆ RetainN()

size_t NPL::A1::Forms::RetainN | ( | const TermNode & | term,
|  | size_t | m = `1`
| ) |  |

保留经检查确保具有指定个数参数的项：保留求值。

返回
  项的参数个数。

异常

  ArityMismatch | 项的参数个数不等于第二参数。

参见
  FetchArgumentN

在文件 NPLA1Forms.cpp 第 2011 行定义.

引用了 NPL::A1::Internals::term.

被这些函数引用 AccL(), AccR(), CallBinary(), CallBinaryAs(), CallRawUnary(), CheckEnvironment(), FoldR1(), ForwardListFirst(), GetCurrentEnvironment(), LoadModule_std_environments(), LoadModule_std_io(), LoadModule_std_system(), LockCurrentEnvironment(), Map1() , 以及 ValueOf().

这是这个函数的调用关系图:

## ◆ Sequence()

ReductionStatus NPL::A1::Forms::Sequence | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

序列有序参数规约：移除第一项后顺序规约子项，结果为最后一个子项的规约结果。

返回
  子项被规约时为最后一个子项的规约状态，否则为 ReductionStatus::Clean 。

注解
  可直接实现顺序求值。在对象语言中，若参数为空，返回未指定值。

参见
  ReduceOrdered
  RemoveHead

自从
  build 823

参考调用文法：

    $sequence <expression-sequence>...

在文件 NPLA1Forms.cpp 第 2605 行定义.

引用了 NPL::A1::ReduceOrdered(), YSLib::RemoveHead() , 以及 NPL::A1::Internals::term.

函数调用图:

## ◆ SetFirst()

void NPL::A1::Forms::SetFirst | ( | TermNode & | term | ) |

修改第一参数指定的列表以第二参数作为第一个元素。

异常

  ListTypeError | 第一参数不是非空列表。
  ValueCategoryMismatch | 第一参数不是引用值。

自从
  build 834

第二参数转换为右值。 替代引用值直接通过插入第一个元素引用的值实现。

参考调用文法：

    set-first! <list> <object>

在文件 NPLA1Forms.cpp 第 2275 行定义.

引用了 NPL::dst, ystdex::ref() , 以及 NPL::A1::Internals::term.

函数调用图:

## ◆ SetFirstAt()

void NPL::A1::Forms::SetFirstAt | ( | TermNode & | term | ) |

警告
  除自赋值外，不检查循环引用。

自从
  build 873

保留第二参数未折叠的引用值。

参考调用文法：

    set-first@! <list> <object>

在文件 NPLA1Forms.cpp 第 2283 行定义.

引用了 NPL::dst, NPL::A1::Internals::term , 以及 YSLib::UI::y.

## ◆ SetFirstRef()

void NPL::A1::Forms::SetFirstRef | ( | TermNode & | term | ) |

保留第二参数引用值。

参考调用文法：

    set-first%! <list> <object>

在文件 NPLA1Forms.cpp 第 2291 行定义.

引用了 NPL::dst, NPL::LiftCollapsed(), ystdex::ref(), NPL::A1::Internals::term , 以及 YSLib::UI::y.

函数调用图:

## ◆ SetRest()

void NPL::A1::Forms::SetRest | ( | TermNode & | term | ) |

修改第一参数指定的列表以第二参数作为第一个元素外的列表。

异常

  ListTypeError | 第二参数不是列表。

参见
  LiftSubtermsToReturn

第二参数的元素转换为右值。 替代引用值通过 LiftSubtermsToReturn 插入第一个元素前的每个子项实现。

参考调用文法：

    set-rest! <list> <object>

在文件 NPLA1Forms.cpp 第 2300 行定义.

引用了 NPL::A1::Internals::term.

## ◆ SetRestRef()

void NPL::A1::Forms::SetRestRef | ( | TermNode & | term | ) |

警告
  不检查循环引用。

保留第二参数元素中的引用值。

参考调用文法：

    set-rest%! <list> <object>

在文件 NPLA1Forms.cpp 第 2306 行定义.

引用了 NPL::A1::Internals::term.

## ◆ SetWithNoRecursion()

ReductionStatus NPL::A1::Forms::SetWithNoRecursion | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

修改指定环境的绑定，不带递归匹配。

自从
  build 868

同 DefineWithNoRecursion ，但由规约第一参数子项的结果显式地确定被修改的环境。

参考调用文法：

    $set! <environment> <formals> <expressions>

在文件 NPLA1Forms.cpp 第 2439 行定义.

引用了 NPL::A1::Internals::term.

## ◆ SetWithRecursion()

ReductionStatus NPL::A1::Forms::SetWithRecursion | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

修改指定环境的绑定，带递归匹配。

同 DefineWithRecursion ，但由规约第一参数子项的结果显式地确定被修改的环境。

参考调用文法：

    $setrec! <environment> <formals> <expressions>

在文件 NPLA1Forms.cpp 第 2445 行定义.

引用了 NPL::A1::Internals::term.

## ◆ StringToSymbol() [1/2]

TokenValue NPL::A1::Forms::StringToSymbol | ( | const string & | s | ) |

创建等于指定字符串值的记号值。

自从
  build 786

注解
  不检查值是否符合符号要求。若能构成符号，则名称为指定字符串。

在文件 NPLA1Forms.cpp 第 1992 行定义.

引用了 CHRLib::s.

## ◆ StringToSymbol() [2/2]

TokenValue NPL::A1::Forms::StringToSymbol | ( | string && | s | ) |

自从
  build 863

在文件 NPLA1Forms.cpp 第 1998 行定义.

引用了 CHRLib::s.

## ◆ SymbolToString()

const string & NPL::A1::Forms::SymbolToString | ( | const TokenValue & | s | ) |

取符号对应的名称字符串。

在文件 NPLA1Forms.cpp 第 2005 行定义.

引用了 CHRLib::s.

## ◆ Undefine()

void NPL::A1::Forms::Undefine | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

移除定义引入的绑定。

异常

  InvalidSyntax | 标识符不是符号。
  TypeError | 当前环境被冻结。

参见
  IsNPLASymbol
  RemoveIdentifier

自从
  build 867

移除名称和关联的值，返回是否被移除。 移除不存在的名称时忽略。

参考调用文法：

    $undef! <symbol>

在文件 NPLA1Forms.cpp 第 2451 行定义.

引用了 NPL::A1::Internals::term.

## ◆ UndefineChecked()

void NPL::A1::Forms::UndefineChecked | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

检查并移除名称绑定。

异常

  BadIdentifier | 移除不存在的名称。

移除名称和关联的值。 移除不存在的名称抛出异常。

参考调用文法：

    $undef-checked! <symbol>

在文件 NPLA1Forms.cpp 第 2459 行定义.

引用了 NPL::A1::Internals::term.

## ◆ Unless()

ReductionStatus NPL::A1::Forms::Unless | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

条件顺序求值：预期条件不成立。

自从
  build 868

求值第一参数子项作为测试条件，不成立时顺序求值之后的子项。

参考调用文法：

    $unless <test> <expression-sequence>

在文件 NPLA1Forms.cpp 第 2099 行定义.

引用了 NPL::A1::Internals::term.

## ◆ Unwrap()

ReductionStatus NPL::A1::Forms::Unwrap | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

解包装应用子为合并子。

自从
  build 858

参考调用文法：

    unwrap <applicative>

在文件 NPLA1Forms.cpp 第 2540 行定义.

引用了 ystdex::ref() , 以及 NPL::A1::Internals::term.

函数调用图:

## ◆ ValueOf()

ReductionStatus NPL::A1::Forms::ValueOf | ( | TermNode & | term,
|  | const ContextNode & | ctx
| ) |  |

求值标识符得到指称的实体。

参见
  EvaluateIdentifier

自从
  build 757

在对象语言中实现函数接受一个 string 类型的参数项，返回值为指定的实体。 当名称查找失败时，返回的值为 ValueToken::Null 。

参考调用文法：

    value-of <object>

在文件 NPLA1Forms.cpp 第 2400 行定义.

引用了 CatchIgnore, NPL::A1::EvaluateIdentifier(), next, CHRLib::CharSet::Null, RetainN(), NPL::A1::Internals::term , 以及 TryRet.

被这些函数引用 LoadModule_std_environments().

函数调用图:
这是这个函数的调用关系图:

## ◆ Vau()

ReductionStatus NPL::A1::Forms::Vau | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

vau 抽象：求值为一个捕获当前上下文的非严格求值的函数。

注解
  动态环境的上下文参数被捕获为一个 lref<ContextNode> 对象。
  初始化的 <eformal> 表示动态环境的上下文参数，应为一个符号或 #ignore 。
  引入的处理器的 operator() 支持保存当前动作。

异常

  InvalidSyntax | 语法错误：<eformal> 不是符号。

上下文中环境以外的数据成员总是被复制而不被转移， 以避免求值过程中继续访问这些成员引起未定义行为。

捕获的静态环境由当前动态环境隐式确定。 不保留环境的所有权。

按值传递返回值：提升项以避免返回引用造成内存安全问题。

参考调用文法：

    $vau <formals> <eformal> <body>

在文件 NPLA1Forms.cpp 第 2480 行定义.

引用了 NPL::A1::Internals::term.

## ◆ VauRef()

ReductionStatus NPL::A1::Forms::VauRef | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

自从
  build 822

在返回时不提升项，允许返回引用。

参考调用文法：

    $vau% <formals> <eformal> <body>

在文件 NPLA1Forms.cpp 第 2486 行定义.

引用了 NPL::A1::Internals::term.

## ◆ VauWithEnvironment()

ReductionStatus NPL::A1::Forms::VauWithEnvironment | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

带环境的 vau 抽象：求值为一个捕获当前上下文的非严格求值的函数。

参见
  ResolveEnvironment

捕获的静态环境由环境参数 <environment> 求值后指定。 根据环境参数的类型为 `shared_ptr<Environment>` 或 `weak_ptr<Environment>` 决定是否保留所有权。

按值传递返回值：提升项以避免返回引用造成内存安全问题。

参考调用文法：

    $vau/e <environment> <formals> <eformal> <body>

在文件 NPLA1Forms.cpp 第 2492 行定义.

引用了 NPL::A1::Internals::term.

## ◆ VauWithEnvironmentRef()

ReductionStatus NPL::A1::Forms::VauWithEnvironmentRef | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

在返回时不提升项，允许返回引用。

参考调用文法：

    $vau/e% <environment> <formals> <eformal> <body>

在文件 NPLA1Forms.cpp 第 2498 行定义.

引用了 NPL::A1::Internals::term.

## ◆ When()

ReductionStatus NPL::A1::Forms::When | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

条件顺序求值：预期条件成立。

自从
  build 868

求值第一参数子项作为测试条件，成立时顺序求值之后的子项。

参考调用文法：

    $when <test> <expression-sequence>

在文件 NPLA1Forms.cpp 第 2093 行定义.

引用了 NPL::A1::Internals::term.

## ◆ Wrap()

ReductionStatus NPL::A1::Forms::Wrap | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

包装合并子为应用子。

自从
  build 859

异常

  NPLException | 包装数溢出。

参考调用文法：

    wrap <combiner>

在文件 NPLA1Forms.cpp 第 2505 行定义.

引用了 NPL::A1::Internals::term.

## ◆ WrapOnce()

ReductionStatus NPL::A1::Forms::WrapOnce | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

包装操作子为应用子。

异常

  TypeError | 应用子参数的类型不符合要求。

参考调用文法：

    wrap1 <operative>

在文件 NPLA1Forms.cpp 第 2528 行定义.

引用了 NPL::A1::Internals::term.

## ◆ WrapOnceRef()

ReductionStatus NPL::A1::Forms::WrapOnceRef | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

包装操作子为应用子。

允许返回引用。

参考调用文法：

    wrap1& <operative>

在文件 NPLA1Forms.cpp 第 2534 行定义.

引用了 NPL::A1::Internals::term.

## ◆ WrapRef()

ReductionStatus NPL::A1::Forms::WrapRef | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

包装合并子为应用子。

异常

  NPLException | 包装数溢出。

允许返回引用。

参考调用文法：

    wrap& <combiner>

在文件 NPLA1Forms.cpp 第 2518 行定义.

引用了 NPL::A1::Internals::ReduceForCombinerRef() , 以及 NPL::A1::Internals::term.

函数调用图: