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

YSTest PreAlpha_b800_20170810 The YSLib Test Project

- 首页
- 相关页面
- 模块
- 命名空间
- 类
- 文件

- 命名空间列表
- 命名空间成员

命名空间 | 类 | 枚举 | 函数 | 变量
NPL::A1 命名空间参考

## 命名空间

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

## 类

class | FormContextHandler
| 形式上下文处理器。 更多...
struct | NPLA1Tag
| NPLA1 元标签。 更多...
class | REPLContext
class | StrictContextHandler
| 严格上下文处理器。 更多...
struct | WrappedContextHandler
| 包装上下文处理器。 更多...

## 枚举

enum | ValueToken { ValueToken::Null, ValueToken::Undefined, ValueToken::Unspecified, ValueToken::GroupingAnchor, ValueToken::OrderedAnchor }
| 值记号：节点中的值的占位符。 更多...

## 函数

YF_API ValueNode | TransformNode (const TermNode &, NodeMapper={}, NodeMapper=MapNPLALeafNode, NodeToString=ParseNPLANodeString, NodeInserter=InsertChild)

变换 NPLA1 节点 S 表达式抽象语法树为 NPLA1 语义结构。

异常

  std::bad_function_call | 第三至五参数为空。

更多...

YF_API ValueNode | TransformNodeSequence (const TermNode &, NodeMapper={}, NodeMapper=MapNPLALeafNode, NodeToString=ParseNPLANodeString, NodeSequenceInserter=InsertSequenceChild)

变换 NPLA1 节点 S 表达式抽象语法树为 NPLA1 序列语义结构。

异常

  std::bad_function_call | 第三至五参数为空。

更多...

YF_API LiteralPasses & | AccessLiteralPassesRef (ContextNode &)
| 访问字面量遍。 更多...
YF_API ReductionStatus | InvokeLiteral (TermNode &, ContextNode &, string_view)
| 调用字面量遍。 更多...
YF_API ReductionStatus | Reduce (TermNode &, ContextNode &)
| NPLA1 表达式节点规约：调用至少一次求值例程规约子表达式。 更多...
con ctx ctx YF_API ReductionStatus | ReduceFirst (TermNode &, ContextNode &)
| 规约第一个子项。 更多...
YF_API ReductionStatus | ReduceOrdered (TermNode &, ContextNode &)
| 规约有序序列：顺序规约子项，结果为最后一个子项的规约结果。 更多...
YF_API ReductionStatus | ReduceTail (TermNode &, ContextNode &, TNIter)
| 移除容器第一个子项到指定迭代器的项后规约。 更多...
YF_API void | SetupTraceDepth (ContextNode &ctx, const string &name=yimpl("$__depth"))
| 设置跟踪深度节点：调用规约时显示深度和上下文等信息。 更多...
YF_API ReductionStatus | ReplaceSeparatedChildren (TermNode &, const ValueObject &, const ValueObject &)
| 查找项中的指定分隔符，若找到则替换项为去除分隔符并添加替换前缀的形式。 更多...
YF_API void | RegisterSequenceContextTransformer (EvaluationPasses &, ContextNode &, const TokenValue &, const ValueObject &, bool={})
| 注册分隔符转换变换和处理例程。 更多...
| PDefH (void, AssertBranch, const TermNode &term, const char *msg="Invalid term found.") ynothrowv ImplExpr(yunused(msg)
| 断言枝节点。 更多...
| YAssert (IsBranch(term), msg)) inline PDefH(size_t
| 取项的参数个数：子项数减 1 。 更多...
const TermNode &term ynothrowv | ImplRet (AssertBranch(term), term.size()-1) YF_API ReductionStatus EvaluateDelayed(TermNode &)
| 求值以节点数据结构间接表示的项。 更多...
YF_API ReductionStatus | EvaluateDelayed (TermNode &, DelayedTerm &)
| 求值指定的延迟求值项。 更多...
YF_API ReductionStatus | ReduceCombined (TermNode &, ContextNode &)
| 规约合并项：检查项的第一个子项尝试作为操作符进行函数应用，并规范化。 更多...
YF_API ReductionStatus | ReduceLeafToken (TermNode &, ContextNode &)

规约提取名称的叶节点记号。

异常

  BadIdentifier | 标识符未声明。

更多...

YF_API observer_ptr< ValueNode > | ResolveName (const ContextNode &, string_view)
| 解析名称：处理保留名称并查找名称。 更多...
string | to_string (ValueToken vt)
ReductionStatus | EvaluateDelayed (TermNode &term)
void | SetupDefaultInterpretation (ContextNode &root, EvaluationPasses passes)
YF_API void | InsertChild (TermNode &&, TermNode::Container &)
| 插入 NPLA1 子节点。 更多...
YF_API void | InsertSequenceChild (TermNode &&, NodeSequence &)
template<typename _type , typename... _tParams>
ValueNode | LoadNode (_type &&tree, _tParams &&...args)
| 加载 NPLA1 翻译单元。 更多...
template<typename _type , typename... _tParams>
ValueNode | LoadNodeSequence (_type &&tree, _tParams &&...args)
YF_API GuardPasses & | AccessGuardPassesRef (ContextNode &)
| 访问守护遍。 更多...
YF_API EvaluationPasses & | AccessLeafPassesRef (ContextNode &)
| 访问叶遍。 更多...
YF_API EvaluationPasses & | AccessListPassesRef (ContextNode &)
| 访问列表遍。 更多...
YF_API Guard | InvokeGuard (TermNode &term, ContextNode &)
| 调用守护遍。 更多...
YF_API ReductionStatus | InvokeLeaf (TermNode &term, ContextNode &)
| 调用叶遍。 更多...
YF_API ReductionStatus | InvokeList (TermNode &term, ContextNode &)
| 调用列表遍。 更多...
YF_API void | ReduceArguments (TNIter, TNIter, ContextNode &)
| 对范围内的第二项开始逐项规约。 更多...
| PDefH (void, ReduceArguments, TermNode::Container &con, ContextNode &ctx) ImplRet(ReduceArguments(con.begin()
con | end ()
con ctx | PDefH (void, ReduceArguments, TermNode &term, ContextNode &ctx) ImplRet(ReduceArguments(term.GetContainerRef()
con ctx ctx YF_API void | ReduceChecked (TermNode &, ContextNode &)
| 规约并检查成功：调用 Reduce 并检查结果。 更多...
YF_API void | ReduceCheckedClosure (TermNode &, ContextNode &, bool, TermNode &)
| 规约闭包。 更多...
YF_API void | ReduceChildren (TNIter, TNIter, ContextNode &)
| 规约子项。 更多...
| PDefH (void, ReduceChildren, TermNode::Container &con, ContextNode &ctx) ImplExpr(ReduceChildren(con.begin()
con ctx | PDefH (void, ReduceChildren, TermNode &term, ContextNode &ctx) ImplExpr(ReduceChildren(term.GetContainerRef()
con ctx ctx YF_API ReductionStatus | ReduceChildrenOrdered (TNIter, TNIter, ContextNode &)
| 有序规约子项。 更多...
| PDefH (ReductionStatus, ReduceChildrenOrdered, TermNode::Container &con, ContextNode &ctx) ImplRet(ReduceChildrenOrdered(con.begin()
con ctx | PDefH (ReductionStatus, ReduceChildrenOrdered, TermNode &term, ContextNode &ctx) ImplRet(ReduceChildrenOrdered(term.GetContainerRef()
YF_API TermNode | TransformForSeparator (const TermNode &, const ValueObject &, const ValueObject &, const TokenValue &={})
| 变换分隔符中缀表达式为前缀表达式。 更多...
YF_API TermNode | TransformForSeparatorRecursive (const TermNode &, const ValueObject &, const ValueObject &, const TokenValue &={})
template<class _tDst , typename _func >
_tDst | WrapContextHandler (_func &&h, ystdex::false_)
template<class , typename _func >
_func | WrapContextHandler (_func &&h, ystdex::true_)
template<class _tDst , typename _func >
_tDst | WrapContextHandler (_func &&h)
template<typename... _tParams>
void | RegisterForm (ContextNode &ctx, const string &name, _tParams &&...args)
template<typename... _tParams>
ContextHandler | ToContextHandler (_tParams &&...args)
| 转换上下文处理器。 更多...
template<typename... _tParams>
void | RegisterStrict (ContextNode &ctx, const string &name, _tParams &&...args)
| 注册严格上下文处理器。 更多...
YF_API ReductionStatus | EvaluateIdentifier (TermNode &, const ContextNode &, string_view)
| 求值标识符。 更多...
YF_API ReductionStatus | EvaluateLeafToken (TermNode &, ContextNode &, string_view)
| 求值叶节点记号。 更多...

## 变量

| FetchArgumentN
| EvaluationPasses
YF_API pair< shared_ptr< Environment >, bool > | ResolveEnvironment (ValueObject &)
| 解析环境。 更多...
| PDefH (pair< shared_ptr< Environment > YPP_Comma bool >, ResolveEnvironment, TermNode &term) ImplRet(ResolveEnvironment(ReferenceTerm(term).Value)) YF_API void SetupDefaultInterpretation(ContextNode &
| 设置默认解释：解释使用的公共处理遍。 更多...

## 详细描述

自从
  build 665

## 函数说明

GuardPasses & NPL::A1::AccessGuardPassesRef | ( | ContextNode & | ctx | ) |

访问守护遍。

自从
  build 685

在文件 NPLA1.cpp 第 502 行定义.

参考 NPL::ContextNode::Guard.

参考自 LoadNodeSequence() , 以及 SetupTraceDepth().

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

EvaluationPasses & NPL::A1::AccessLeafPassesRef | ( | ContextNode & | ctx | ) |

访问叶遍。

在文件 NPLA1.cpp 第 508 行定义.

参考 NPL::ContextNode::EvaluateLeaf.

参考自 LoadNodeSequence() , 以及 SetupDefaultInterpretation().

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

EvaluationPasses & NPL::A1::AccessListPassesRef | ( | ContextNode & | ctx | ) |

访问列表遍。

在文件 NPLA1.cpp 第 514 行定义.

参考 NPL::ContextNode::EvaluateList.

参考自 LoadNodeSequence() , 以及 SetupDefaultInterpretation().

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

LiteralPasses & NPL::A1::AccessLiteralPassesRef | ( | ContextNode & | ctx | ) |

访问字面量遍。

自从
  build 738

在文件 NPLA1.cpp 第 520 行定义.

参考 NPL::ContextNode::EvaluateLiteral.

参考自 LoadNodeSequence().

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

con NPL::A1::end | ( |  | ) |

ReductionStatus NPL::A1::EvaluateDelayed | ( | TermNode & | term,
|  | DelayedTerm & | delayed
| ) |  |

求值指定的延迟求值项。

返回
  ReductionStatus::Retrying 。

自从
  build 761

提升指定的延迟求值项并规约。

在文件 NPLA1.cpp 第 807 行定义.

ReductionStatus NPL::A1::EvaluateDelayed | ( | TermNode & | term | ) |

在文件 NPLA1.cpp 第 800 行定义.

参考 ystdex::call_value_or().

参考自 EvaluateIdentifier().

函数调用图:

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

ReductionStatus NPL::A1::EvaluateIdentifier | ( | TermNode & | term,
|  | const ContextNode & | ctx,
|  | string_view | id
| ) |  |

求值标识符。

异常

  BadIdentifier | 标识符未声明。

注解
  默认结果为 ReductionStatus::Clean 以保证强规范化性质。

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

注解
  不验证标识符是否为字面量；仅以字面量处理时可能需要重规约。

参见
  EvaluateDelayed
  LiftTermRef
  LiteralHandler
  ReferenceTerm
  ResolveName
  TermReference

自从
  build 745

依次进行以下求值操作： 调用 ResolveName 根据指定名称查找值，若失败抛出未声明异常； 初始化值； 以 LiteralHandler 访问字面量处理器，若成功调用并返回字面量处理器的处理结果。 若未返回，根据节点表示的值进一步处理： 对表示非 TokenValue 值的叶节点，调用 EvaluateDelayed 求值； 对表示 TokenValue 值的叶节点，返回 ReductionStatus::Clean ； 对枝节点视为列表，返回 ReductionStatus::Retained 。 初始化值的目标是第一参数的 Value 数据成员，包括以下操作： 调用 ReferenceTerm 确保进一步操作解析得到的（保存在环境中的）项对象不是引用； 若上一步得到的值是空列表或 TokenValue ，直接复制； 否则，目标初始化为引用上一步得到的值的新创建 TermReference 值。 调用 ReferenceTerm 再初始化 TermReference 实现引用折叠，确保不构造引用的引用。

在文件 NPLA1.cpp 第 817 行定义.

参考 EvaluateDelayed(), NPL::IsLeaf, CHRLib::p(), NPL::ReferenceTerm() , 以及 ResolveName().

参考自 EvaluateLeafToken() , 以及 NPL::A1::Forms::ValueOf().

函数调用图:

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

ReductionStatus NPL::A1::EvaluateLeafToken | ( | TermNode & | term,
|  | ContextNode & | ctx,
|  | string_view | id
| ) |  |

求值叶节点记号。

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

参见
  CategorizeLexeme
  DeliteralizeUnchecked
  EvaluateIdentifier
  InvokeLiteral

自从
  build 736

处理非空字符串表示的节点记号。 依次进行以下求值操作。 对代码字面量，去除字面量边界分隔符后进一步求值。 对数据字面量，去除字面量边界分隔符作为字符串值。 对其它字面量，通过调用字面量遍处理。 最后求值非字面量的标识符。

在文件 NPLA1.cpp 第 854 行定义.

参考 NPL::CategorizeBasicLexeme(), NPL::CheckReducible(), ystdex::data(), NPL::Deliteralize(), EvaluateIdentifier(), InvokeLiteral(), YAssertNonnull, YB_ATTR_fallthrough , 以及 YB_UNLIKELY.

参考自 ReduceLeafToken().

函数调用图:

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

const TermNode& term ynothrowv NPL::A1::ImplRet | ( | AssertBranch(term) | ,
|  | term.size()- | 1
| ) |  |

求值以节点数据结构间接表示的项。

注解
  第一参数指定输入的项，其 Value 指定输出的值。

参见
  LiftDelayed

自从
  build 752

以 TermNode 按项访问值，若成功调用 LiftTermRef 替换值并返回要求重规约。 以项访问对规约以项转移的可能未求值的操作数是必要的。

参考自 LoadNodeSequence().

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

void NPL::A1::InsertChild | ( | TermNode && | term,
|  | TermNode::Container & | con
| ) |  |

插入 NPLA1 子节点。

自从
  build 674

注解
  插入后按名称排序顺序。

第一参数指定的变换结果插入第二参数指定的容器。 若映射操作返回节点名称为空则根据当前容器内子节点数量加前缀 $ 命名以避免重复。

在文件 NPLA1.cpp 第 63 行定义.

参考 YSLib::AsNode(), YSLib::MakeIndex , 以及 NPL::MapToValueNode.

函数调用图:

void NPL::A1::InsertSequenceChild | ( | TermNode && | term,
|  | NodeSequence & | con
| ) |  |

注解
  保持顺序。

直接插入 NPLA1 子节点到序列容器末尾。

在文件 NPLA1.cpp 第 70 行定义.

参考 NPL::MapToValueNode.

Guard NPL::A1::InvokeGuard | ( | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

调用守护遍。

参见
  InvokePasses
  GuardPasses

自从
  build 726

在文件 NPLA1.cpp 第 526 行定义.

参考 NPL::ContextNode::Guard.

参考自 LoadNodeSequence() , 以及 Reduce().

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

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

调用叶遍。

参见
  EvaluationPasses

自从
  build 730

在文件 NPLA1.cpp 第 532 行定义.

参考 NPL::ContextNode::EvaluateLeaf.

参考自 LoadNodeSequence() , 以及 Reduce().

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

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

调用列表遍。

在文件 NPLA1.cpp 第 538 行定义.

参考 NPL::ContextNode::EvaluateList.

参考自 LoadNodeSequence() , 以及 Reduce().

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

ReductionStatus NPL::A1::InvokeLiteral | ( | TermNode & | term,
|  | ContextNode & | ctx,
|  | string_view | id
| ) |  |

调用字面量遍。

前置条件
  断言：字符串参数的数据指针非空。

参见
  LiteralPasses

自从
  build 738

在文件 NPLA1.cpp 第 544 行定义.

参考 ystdex::data(), NPL::ContextNode::EvaluateLiteral , 以及 YAssertNonnull.

参考自 EvaluateLeafToken() , 以及 LoadNodeSequence().

函数调用图:

这是这个函数的调用关系图:
template<typename _type , typename... _tParams>

ValueNode NPL::A1::LoadNode | ( | _type && | tree,
|  | _tParams &&... | args
| ) |  |

加载 NPLA1 翻译单元。

异常

  LoggedEvent | 警告：被加载配置中的实体转换失败。

在文件 NPLA1.h 第 154 行定义.

参考 CHRLib::args, CatchThrow, CHRLib::e, ystdex::bad_any_cast::from(), ystdex::sfmt(), ystdex::bad_any_cast::to(), TransformNode(), TryRet, platform::Descriptions::Warning , 以及 yforward.

参考自 YSLib::FetchMIMEBiMapping(), YSLib::UI::WidgetLoader::LoadUILayout() , 以及 NPL::operator>>().

函数调用图:

这是这个函数的调用关系图:
template<typename _type , typename... _tParams>

ValueNode NPL::A1::LoadNodeSequence | ( | _type && | tree,
|  | _tParams &&... | args
| ) |  |

在文件 NPLA1.h 第 165 行定义.

参考 AccessGuardPassesRef(), AccessLeafPassesRef(), AccessListPassesRef(), AccessLiteralPassesRef(), CHRLib::args, CatchThrow, ystdex::bad_any_cast::from(), NPL::ImplExpr(), ImplRet(), InvokeGuard(), InvokeLeaf(), InvokeList(), InvokeLiteral(), YSLib::UI::name, PDefH(), Reduce(), ReduceArguments(), ReduceChecked(), ReduceCheckedClosure(), ReduceChildren(), ReduceChildrenOrdered(), ReduceFirst(), ReduceOrdered(), ReduceTail(), ReplaceSeparatedChildren(), SetupTraceDepth(), ystdex::sfmt(), ystdex::bad_any_cast::to(), TransformForSeparator(), TransformForSeparatorRecursive(), TransformNodeSequence(), TryRet, platform::Descriptions::Warning, YF_API, yforward , 以及 yimpl.

函数调用图:

NPL::A1::PDefH | ( | void | ,
|  | ReduceArguments | ,
|  | TermNode::Container & | con,
|  | ContextNode & | ctx
| ) |  |

inline

自从
  build 685

参考自 LoadNodeSequence().

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

con ctx NPL::A1::PDefH | ( | void | ,
|  | ReduceArguments | ,
|  | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

inline

NPL::A1::PDefH | ( | void | ,
|  | ReduceChildren | ,
|  | TermNode::Container & | con,
|  | ContextNode & | ctx
| ) |  |

inline

con ctx NPL::A1::PDefH | ( | void | ,
|  | ReduceChildren | ,
|  | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

inline

NPL::A1::PDefH | ( | ReductionStatus | ,
|  | ReduceChildrenOrdered | ,
|  | TermNode::Container & | con,
|  | ContextNode & | ctx
| ) |  |

inline

con ctx NPL::A1::PDefH | ( | ReductionStatus | ,
|  | ReduceChildrenOrdered | ,
|  | TermNode & | term,
|  | ContextNode & | ctx
| ) |  |

inline

NPL::A1::PDefH | ( | void | ,
|  | AssertBranch | ,
|  | const TermNode & | term,
|  | const char * | msg = `"Invalid term found."`
| ) |  |

inline

断言枝节点。

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

自从
  build 761

NPL::A1::PDefH | ( | pair< shared_ptr< Environment > YPP_Comma bool > | ,
|  | ResolveEnvironment | ,
|  | TermNode & | term
| ) |  |

inline

设置默认解释：解释使用的公共处理遍。

自从
  build 800

注解
  非强异常安全：加入遍可能提前设置状态而不在失败时回滚。

参见
  ReduceCombined
  ReduceFirst
  ReduceHeadEmptyList
  ReduceLeafToken

自从
  build 736

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

NPLA1 表达式节点规约：调用至少一次求值例程规约子表达式。

返回
  规约状态。

注解
  可能使参数中容器的迭代器失效。
  默认不需要重规约。这可被求值遍改变。
  可被求值遍调用以实现递归求值。
  异常安全取决于调用遍的最低异常安全保证。

参见
  CheckReducible
  InvokeGuard
  InvokeLeaf
  InvokeList
  ValueToken

自从
  build 730

待办事项:
  实现 ValueToken 保留处理。

规约顺序如下： 调用 InvokeGuard 进行必要的上下文重置； 迭代规约，直至不需要进行重规约。 对应不同的节点次级结构分类，一次迭代按以下顺序选择以下分支之一，按需规约子项： 对枝节点调用 InvokeList 求值； 对空节点或值为 ValueToken 的叶节点不进行操作； 对其它叶节点调用 InvokeLeaf 求值。 迭代结束调用 CheckReducible ，根据结果判断是否进行重规约。 此处约定的迭代中对节点的具体结构分类默认也适用于其它 NPLA1 实现 API ； 例外情况应单独指定明确的顺序。 例外情况包括输入节点不是表达式语义结构（而是 AST ）的 API ，如 TransformNode 。 当前实现返回的规约状态总是 ReductionStatus::Clean ，否则会循环迭代。 若需要保证无异常时仅在规约成功后终止，使用 ReduceChecked 代替。

在文件 NPLA1.cpp 第 552 行定义.

参考 NPL::CheckReducible(), InvokeGuard(), InvokeLeaf(), InvokeList(), ystdex::retry_on_cond(), ystdex::type_id() , 以及 YSLib::YAssert().

参考自 NPL::SContext::Analyze(), NPL::A1::Forms::Eval(), LoadNodeSequence(), NPL::A1::REPLContext::Process(), NPL::SContext::Reduce(), ReduceChecked(), ReduceChildren(), ReduceChildrenOrdered(), ReduceFirst() , 以及 ReduceTail().

函数调用图:

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

void NPL::A1::ReduceArguments | ( | TNIter | first,
|  | TNIter | last,
|  | ContextNode & | ctx
| ) |  |

对范围内的第二项开始逐项规约。

注解
  可能使参数中容器的迭代器失效。

参见
  Reduce

注解
  按语言规范，子项规约顺序未指定。
  忽略子项重规约要求。

异常

  InvalidSyntax | 容器为空。

参见
  ReduceChildren

自从
  build 773

在文件 NPLA1.cpp 第 583 行定义.

参考 ReduceChildren().

参考自 LoadNodeSequence().

函数调用图:

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

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

规约并检查成功：调用 Reduce 并检查结果。

自从
  build 735

注解
  失败视为重规约。

参见
  CheckedReduceWith
  Reduce

在文件 NPLA1.cpp 第 594 行定义.

参考 NPL::CheckedReduceWith , 以及 Reduce().

参考自 NPL::A1::Forms::DefineWithNoRecursion(), NPL::A1::Forms::DefineWithRecursion(), NPL::A1::Forms::If(), LoadNodeSequence(), ReduceCheckedClosure() , 以及 NPL::A1::Forms::VauWithEnvironment().

函数调用图:

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

void NPL::A1::ReduceCheckedClosure | ( | TermNode & | term,
|  | ContextNode & | ctx,
|  | bool | move,
|  | TermNode & | closure
| ) |  |

规约闭包。

参见
  ReduceChecked

构造规约项，规约后替换到第一参数指定项。 规约项的内容由第四参数的闭包指定。第三参数指定是否通过转移构造而不保留原项。 规约后转移闭包规约的结果：子项以及引用的值的目标被转移到第一参数指定的项。 结果中子项和值之间被转移的相对顺序未指定。

在文件 NPLA1.cpp 第 600 行定义.

参考 NPL::LiftTerm(), NPL::LiftToSelf, YSLib::NoContainer , 以及 ReduceChecked().

参考自 LoadNodeSequence().

函数调用图:

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

void NPL::A1::ReduceChildren | ( | TNIter | first,
|  | TNIter | last,
|  | ContextNode & | ctx
| ) |  |

规约子项。

自从
  build 697

在文件 NPLA1.cpp 第 633 行定义.

参考 ystdex::bind1(), Reduce() , 以及 ystdex::ref().

参考自 LoadNodeSequence(), ReduceArguments() , 以及 RegisterSequenceContextTransformer().

函数调用图:

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

ReductionStatus NPL::A1::ReduceChildrenOrdered | ( | TNIter | first,
|  | TNIter | last,
|  | ContextNode & | ctx
| ) |  |

有序规约子项。

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

自从
  build 773

在文件 NPLA1.cpp 第 643 行定义.

参考 YSLib::i , 以及 Reduce().

参考自 LoadNodeSequence() , 以及 ReduceOrdered().

函数调用图:

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

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

规约合并项：检查项的第一个子项尝试作为操作符进行函数应用，并规范化。

返回
  规约状态。

异常

  ListReductionFailure | 规约失败：枝节点的第一个子项不表示上下文处理器。

参见
  ContextHandler
  Reduce

自从
  build 766

对枝节点尝试以第一个子项的 Value 数据成员为上下文处理器并调用，且当规约终止时规范化； 否则视为规约成功，没有其它作用。 若发生 ContextHandler 调用，调用前先转移处理器保证生存期， 以允许处理器内部移除或修改之前占用的第一个子项（包括其中的 Value 数据成员）。

在文件 NPLA1.cpp 第 895 行定义.

参考 ystdex::as_const(), ystdex::cpp2011::begin(), NPL::c_str(), platform::Deref(), FetchArgumentN, CHRLib::p(), ystdex::sfmt() , 以及 NPL::TermToNamePtr().

参考自 SetupDefaultInterpretation().

函数调用图:

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

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

规约第一个子项。

返回
  规约状态。

参见
  Reduce
  https://en.wikipedia.org/wiki/Fexpr 。

自从
  build 730

快速严格性分析： 无条件求值枝节点第一项以避免非确定性推断子表达式求值的附加复杂度。

在文件 NPLA1.cpp 第 656 行定义.

参考 platform::Deref() , 以及 Reduce().

参考自 LoadNodeSequence() , 以及 SetupDefaultInterpretation().

函数调用图:

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

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

规约提取名称的叶节点记号。

异常

  BadIdentifier | 标识符未声明。

注解
  忽略名称查找失败，默认结果为 ReductionStatus::Clean 以保证强规范化性质。

参见
  EvaluateLeafToken
  TermToNode

在文件 NPLA1.cpp 第 929 行定义.

参考 ystdex::call_value_or(), EvaluateLeafToken() , 以及 NPL::TermToNamePtr().

参考自 SetupDefaultInterpretation().

函数调用图:

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

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

规约有序序列：顺序规约子项，结果为最后一个子项的规约结果。

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

参见
  ReduceChildrenOrdered

自从
  build 764

可直接实现顺序求值。 对空参数返回未指定值。 参考调用文法： $sequence <object>...

在文件 NPLA1.cpp 第 663 行定义.

参考 NPL::LiftTerm() , 以及 ReduceChildrenOrdered().

参考自 LoadNodeSequence() , 以及 RegisterSequenceContextTransformer().

函数调用图:

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

ReductionStatus NPL::A1::ReduceTail | ( | TermNode & | term,
|  | ContextNode & | ctx,
|  | TNIter | i
| ) |  |

移除容器第一个子项到指定迭代器的项后规约。

注解
  按语言规范，子项规约顺序未指定。

自从
  build 733

在文件 NPLA1.cpp 第 678 行定义.

参考 YSLib::i , 以及 Reduce().

参考自 LoadNodeSequence().

函数调用图:

这是这个函数的调用关系图:
template<typename... _tParams>

void NPL::A1::RegisterForm | ( | ContextNode & | ctx,
|  | const string & | name,
|  | _tParams &&... | args
| ) |  |

inline

自从
  build 733

在文件 NPLA1.h 第 619 行定义.

参考 yforward.

参考自 RegisterSequenceContextTransformer().

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

void NPL::A1::RegisterSequenceContextTransformer | ( | EvaluationPasses & | passes,
|  | ContextNode & | node,
|  | const TokenValue & | name,
|  | const ValueObject & | delim,
|  | bool | ordered = `{}`
| ) |  |

注册分隔符转换变换和处理例程。

参见
  NPL::RegisterContextHandler
  ReduceChildren
  ReduceOrdered
  ReplaceSeparatedChildren

自从
  build 753

变换带有中缀形式的分隔符记号的表达式为指定名称的前缀表达式并去除分隔符， 然后注册前缀语法形式。 最后一个参数指定是否有序，选择语法形式为 ReduceOrdered 或 ReduceChildren 之一。 前缀名称不需要是记号支持的标识符。

在文件 NPLA1.cpp 第 787 行定义.

参考 ystdex::bind1(), ReduceChildren(), ReduceOrdered(), RegisterForm() , 以及 ReplaceSeparatedChildren().

函数调用图:
template<typename... _tParams>

void NPL::A1::RegisterStrict | ( | ContextNode & | ctx,
|  | const string & | name,
|  | _tParams &&... | args
| ) |  |

inline

注册严格上下文处理器。

注解
  使用 ADL ToContextHandler 。

自从
  build 754

在文件 NPLA1.h 第 640 行定义.

参考 CHRLib::args, ToContextHandler() , 以及 yforward.

参考自 NPL::A1::Forms::RegisterStrictBinary() , 以及 NPL::A1::Forms::RegisterStrictUnary().

函数调用图:

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

ReductionStatus NPL::A1::ReplaceSeparatedChildren | ( | TermNode & | term,
|  | const ValueObject & | name,
|  | const ValueObject & | delim
| ) |  |

查找项中的指定分隔符，若找到则替换项为去除分隔符并添加替换前缀的形式。

返回
  是否找到并替换了项。

参见
  EvaluationPasses
  TransformForSeparator

自从
  build 730

在文件 NPLA1.cpp 第 736 行定义.

参考 ystdex::bind1(), ystdex::ref() , 以及 TransformForSeparator().

参考自 LoadNodeSequence() , 以及 RegisterSequenceContextTransformer().

函数调用图:

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

pair< shared_ptr< Environment >, bool > NPL::A1::ResolveEnvironment | ( | ValueObject & | vo | ) |

解析环境。

返回
  取得所有权的环境指针及是否具有所有权。

注解
  只支持宿主值类型 `shared_ptr<Environment>` 或 `weak_ptr<Environment>` 。

自从
  build 798

在文件 NPLA1.cpp 第 946 行定义.

参考 YSLib::ValueObject::AccessPtr(), CHRLib::p() , 以及 YSLib::ValueObject::type.

参考自 NPL::A1::Forms::Eval() , 以及 NPL::A1::Forms::VauWithEnvironment().

函数调用图:

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

observer_ptr< ValueNode > NPL::A1::ResolveName | ( | const ContextNode & | ctx,
|  | string_view | id
| ) |  |

解析名称：处理保留名称并查找名称。

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

异常

  NPLException | 访问共享重定向上下文失败。

参见
  Environment::ResolveName

自从
  build 777

解析指定上下文中的名称。

在文件 NPLA1.cpp 第 939 行定义.

参考 ystdex::data(), NPL::ContextNode::GetRecordRef() , 以及 YAssertNonnull.

参考自 EvaluateIdentifier().

函数调用图:

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

void NPL::A1::SetupDefaultInterpretation | ( | ContextNode & | root,
|  | EvaluationPasses | passes
| ) |  |

在文件 NPLA1.cpp 第 958 行定义.

参考 AccessLeafPassesRef(), AccessListPassesRef(), ReduceCombined(), ReduceFirst(), NPL::ReduceHeadEmptyList() , 以及 ReduceLeafToken().

参考自 NPL::A1::REPLContext::REPLContext().

函数调用图:

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

void NPL::A1::SetupTraceDepth | ( | ContextNode & | ctx,
|  | const string & | name = `yimpl("$__depth")`
| ) |  |

设置跟踪深度节点：调用规约时显示深度和上下文等信息。

注解
  主要用于调试。

参见
  InvokeGuard

自从
  build 685

在文件 NPLA1.cpp 第 688 行定义.

参考 AccessGuardPassesRef(), platform::Descriptions::Informative, YSLib::UI::name, ystdex::pvoid(), YSLib::ynothrow, YTraceDe , 以及 yunseq.

参考自 LoadNodeSequence() , 以及 NPL::A1::REPLContext::REPLContext().

函数调用图:

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

string NPL::A1::to_string | ( | ValueToken | vt | ) |

在文件 NPLA1.cpp 第 44 行定义.

参考 CHRLib::CharSet::Null.

template<typename... _tParams>

ContextHandler NPL::A1::ToContextHandler | ( | _tParams &&... | args | ) |

inline

转换上下文处理器。

在文件 NPLA1.h 第 628 行定义.

参考 CHRLib::args , 以及 yforward.

参考自 NPL::A1::Forms::Lambda(), RegisterStrict(), NPL::A1::Forms::Wrap() , 以及 NPL::A1::Forms::WrapOnce().

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

TermNode NPL::A1::TransformForSeparator | ( | const TermNode & | term,
|  | const ValueObject & | pfx,
|  | const ValueObject & | delim,
|  | const TokenValue & | name = `{}`
| ) |  |

变换分隔符中缀表达式为前缀表达式。

注解
  ValueObject 参数分别指定替换添加的前缀和被替换的分隔符的值。

参见
  AsIndexNode

自从
  build 753

移除子项中值和指定分隔符指定的项，并以 AsIndexNode 添加指定前缀值作为子项。 最后一个参数指定返回值的名称。

注解
  非递归变换。

在文件 NPLA1.cpp 第 708 行定义.

参考 YSLib::AsIndexNode(), CHRLib::e, YSLib::MakeIndex , 以及 YSLib::UI::name.

参考自 LoadNodeSequence() , 以及 ReplaceSeparatedChildren().

函数调用图:

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

TermNode NPL::A1::TransformForSeparatorRecursive | ( | const TermNode & | term,
|  | const ValueObject & | pfx,
|  | const ValueObject & | delim,
|  | const TokenValue & | name = `{}`
| ) |  |

注解
  递归变换。

在文件 NPLA1.cpp 第 725 行定义.

参考 CHRLib::e, YSLib::MakeIndex , 以及 YSLib::UI::name.

参考自 LoadNodeSequence().

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

ValueNode NPL::A1::TransformNode | ( | const TermNode & | term,
|  | NodeMapper | mapper = `{}`,
|  | NodeMapper | map_leaf_node = `MapNPLALeafNode`,
|  | NodeToString | node_to_str = `ParseNPLANodeString`,
|  | NodeInserter | insert_child = `InsertChild`
| ) |  |

变换 NPLA1 节点 S 表达式抽象语法树为 NPLA1 语义结构。

异常

  std::bad_function_call | 第三至五参数为空。

返回
  变换后的新节点（及子节点）。

第一参数指定源节点，其余参数指定部分变换规则。 当被调用的第二至第四参数不修改传入的节点参数时变换不修改源节点。 过程如下： 若源节点为叶节点，直接返回使用第三参数创建映射的节点。 若源节点只有一个子节点，直接返回这个子节点的变换结果。 否则，使用第四参数从第一个子节点取作为变换结果名称的字符串。 若名称非空则忽略第一个子节点，只变换剩余子节点。 当剩余一个子节点（即源节点有两个子节点）时，直接递归变换这个节点并返回。 若变换后的结果名称非空，则作为结果的值；否则，结果作为容器内单一的值。 否则，新建节点容器，遍历并变换剩余的节点插入其中，返回以之构造的节点。 第二参数指定此时的映射操作，若为空则默认使用递归 TransformNode 调用。 调用第五参数插入映射的结果到容器。

在文件 NPLA1.cpp 第 76 行定义.

参考 YSLib::AsNode(), ystdex::bind1(), YSLib::i, YSLib::UI::name, CHRLib::s , 以及 yunseq.

参考自 LoadNode().

函数调用图:

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

ValueNode NPL::A1::TransformNodeSequence | ( | const TermNode & | term,
|  | NodeMapper | mapper = `{}`,
|  | NodeMapper | map_leaf_node = `MapNPLALeafNode`,
|  | NodeToString | node_to_str = `ParseNPLANodeString`,
|  | NodeSequenceInserter | insert_child = `InsertSequenceChild`
| ) |  |

变换 NPLA1 节点 S 表达式抽象语法树为 NPLA1 序列语义结构。

异常

  std::bad_function_call | 第三至五参数为空。

返回
  变换后的新节点（及子节点）。

参见
  TransformNode

和 TransformNode 变换规则相同， 但插入的子节点以 NodeSequence 的形式作为变换节点的值而不是子节点，可保持顺序。

在文件 NPLA1.cpp 第 113 行定义.

参考 YSLib::AsNode(), ystdex::bind1(), YSLib::i, YSLib::UI::name, CHRLib::s , 以及 yunseq.

参考自 LoadNodeSequence().

函数调用图:

这是这个函数的调用关系图:
template<class _tDst , typename _func >

_tDst NPL::A1::WrapContextHandler | ( | _func && | h,
|  | ystdex::false_ |
| ) |  |

inline

在文件 NPLA1.h 第 476 行定义.

参考 yforward.

template<class , typename _func >

_func NPL::A1::WrapContextHandler | ( | _func && | h,
|  | ystdex::true_ |
| ) |  |

inline

在文件 NPLA1.h 第 484 行定义.

参考 yforward.

template<class _tDst , typename _func >

_tDst NPL::A1::WrapContextHandler | ( | _func && | h | ) |

inline

在文件 NPLA1.h 第 490 行定义.

参考 yforward.

NPL::A1::YAssert | ( | IsBranch(term) | ,
|  | msg |
| ) |  |

取项的参数个数：子项数减 1 。

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

返回
  项的参数个数。

自从
  build 733

## 变量说明

NPL::A1::EvaluationPasses

在文件 NPLA1.h 第 827 行定义.

NPL::A1::FetchArgumentN

在文件 NPLA1.h 第 679 行定义.

参考自 NPL::A1::Forms::CallBinaryFold(), ReduceCombined() , 以及 NPL::A1::Forms::RetainN().