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

YSTest PreAlpha_b900_20201012 The YSLib Test Project

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

## 命名空间

| Forms
| NPLA1 语法形式对应的功能实现。
| Internals
| 内部接口。

## 类

class | ContextState
| NPLA1 上下文状态。 更多...
class | Continuation
| NPLA1 一等续延。 更多...
class | FormContextHandler
| 形式上下文处理器。 更多...
struct | NPLA1Tag
| NPLA1 元标签。 更多...
struct | PassesCombiner
| 遍合并器：逐次调用序列中的遍直至成功。 更多...
class | REPLContext
struct | SeparatorTransformer
| 中缀分隔符变换器。 更多...
class | WrappedContextHandler
| 包装上下文处理器。 更多...

## 类型定义

using | ContextHandler = YSLib::GHEvent< ReductionStatus(TermNode &, ContextNode &)>
| 上下文处理器类型。 更多...
using | LiteralHandler = YSLib::GHEvent< ReductionStatus(const ContextNode &)>
| 字面量处理器类型。 更多...
template<typename... _tParams>
using | GPasses = YSLib::GEvent< ReductionStatus(_tParams...), YSLib::GCombinerInvoker< ReductionStatus, PassesCombiner > >
| 一般合并遍。 更多...
using | TermPasses = GPasses< TermNode & >
| 项合并遍。 更多...
using | EvaluationPasses = GPasses< TermNode &, ContextNode & >
| 求值合并遍。 更多...
using | LiteralPasses = GPasses< TermNode &, ContextNode &, string_view >
| 字面量合并遍。 更多...
using | Guard = any
| 作用域守卫类型。 更多...
using | GuardPasses = YSLib::GEvent< Guard(TermNode &, ContextNode &), YSLib::GDefaultLastValueInvoker< Guard > >
| 作用域守卫遍：用于需在规约例程的入口和出口关联执行的操作。 更多...
using | EnvironmentGuard = ystdex::guard< EnvironmentSwitcher >
| 求值环境守卫。 更多...
template<typename _fParse >
using | GParsedValue = typename ParseResultOf< _fParse >::value_type
| 解析结果元素类型。 更多...
template<typename _fParse >
using | GTokenizer = function< TermNode(const GParsedValue< _fParse > &)>
| 泛型标记器：分析解析结果元素转换为可能包含记号的节点。 更多...
using | Tokenizer = GTokenizer< ByteParser >
| 标记器：分析词素转换为可能包含记号的节点。 更多...
using | SourcedTokenizer = GTokenizer< SourcedByteParser >
| 标记器：分析带有源代码位置信息的词素转换为可能包含记号的节点。 更多...
using | Action = function< void()>

## 枚举

enum | ValueToken { ValueToken::Null, ValueToken::Undefined, ValueToken::Unspecified, ValueToken::GroupingAnchor, ValueToken::OrderedAnchor }
| 值记号：节点中的值的占位符。 更多...
enum | WrappingKind : decltype(FormContextHandler::Wrapping) { Form = 0, Strict = 1 }
| 包装数种类枚举。 更多...

## 函数

template<typename _type , typename... _tParams>
YB_ATTR_nodiscard ValueNode | LoadNode (_type &&tree, _tParams &&... args)
| 加载 NPLA1 翻译单元。 更多...
YB_NORETURN YF_API void | ThrowInsufficientTermsError ()
| 抛出缺少项的异常。 更多...
YB_NORETURN YF_API | YB_NONNULL (1) void ThrowInvalidSyntaxError(const char *)
| 抛出参数指定消息的语法错误异常。 更多...
YB_NORETURN YF_API void | ThrowInvalidSyntaxError (string_view)
YB_NORETURN YF_API void | ThrowNonmodifiableErrorForAssignee ()
| 抛出被赋值操作数不可修改的异常。 更多...
YB_NORETURN | PDefH (void, ThrowUnsupportedLiteralError, string_view sv) ImplExpr(ThrowUnsupportedLiteralError(sv.data())) YB_NORETURN YF_API void ThrowValueCategoryErrorForFirstArgument(const TermNode &)
| 抛出第一参数不符合预期值类别的异常。 更多...
PDefH(ReductionStatus, Continuation::operator(), ContextNode &ctx) const ImplRet(Handler(ContextState YF_API void | ReduceArguments (TNIter, TNIter, ContextNode &)
| NPLA1 表达式节点规约：调用至少一次求值例程规约子表达式。 更多...
| PDefH (void, ReduceArguments, TermNode &term, ContextNode &ctx) ImplRet(ReduceArguments(term.begin()
term | end ()
term ctx YF_API void | ReduceChildren (TNIter, TNIter, ContextNode &)
| 规约子项。 更多...
| PDefH (void, ReduceChildren, TermNode &term, ContextNode &ctx) ImplExpr(ReduceChildren(term.begin()
term ctx YF_API ReductionStatus | ReduceChildrenOrdered (TNIter, TNIter, ContextNode &)
| 有序规约子项。 更多...
| PDefH (ReductionStatus, ReduceChildrenOrdered, TermNode &term, ContextNode &ctx) ImplRet(ReduceChildrenOrdered(term.begin()
term ctx YF_API ReductionStatus | ReduceFirst (TermNode &, ContextNode &)
| 规约第一个子项。 更多...
YF_API ReductionStatus | ReduceOnce (TermNode &, ContextNode &)
| NPLA1 表达式节点一次规约：转发调用到 NPLA1 表达式节点一次规约续延并调用。 更多...
| PDefH (ReductionStatus, ReduceOnceLifted, TermNode &term, ContextNode &ctx, TermNode &tm) ImplRet(LiftOther(term
| 再次规约提升后的项。 更多...
| ReduceOnce (term, ctx)) YF_API ReductionStatus ReduceOrdered(TermNode &
| 规约有序序列：顺序规约子项，结果为最后一个子项的规约结果。 更多...
ContextNode &YF_API ReductionStatus | ReduceTail (TermNode &, ContextNode &, TNIter)
| 移除容器第一个子项到指定迭代器的项后规约。 更多...
| PDefH (ReductionStatus, ReduceReturnUnspecified, TermNode &term) ynothrow ImplRet((term.Value
| 规约至确定的未指定值。 更多...
YF_API void | InsertChild (ValueNode &&, ValueNode::Container &)
| 插入 NPLA1 子节点。 更多...
YF_API ValueNode | TransformNode (const TermNode &)
| 变换 NPLA1 节点 S 表达式抽象语法树为 NPLA1 语义结构。 更多...
YF_API TermNode | ParseLeaf (string_view, TermNode::allocator_type)
| 分析参数指定的叶节点词素。 更多...
YF_API TermNode | ParseLeafWithSourceInformation (string_view, const shared_ptr< string > &, const SourceLocation &, TermNode::allocator_type)
| 分析参数指定的带有源代码信息和叶节点词素。 更多...
template<class _tDst , typename _func >
YB_ATTR_nodiscard YB_PURE _tDst | WrapContextHandler (_func &&h, ystdex::false_)
template<class , typename _func >
YB_ATTR_nodiscard YB_PURE _func | WrapContextHandler (_func &&h, ystdex::true_)
template<class _tDst , typename _func >
YB_ATTR_nodiscard YB_PURE _tDst | WrapContextHandler (_func &&h)
template<class _tDst , typename _func , class _tAlloc >
YB_ATTR_nodiscard YB_PURE _tDst | WrapContextHandler (_func &&h, const _tAlloc &a, ystdex::false_)
template<class , typename _func , class _tAlloc >
YB_ATTR_nodiscard YB_PURE _func | WrapContextHandler (_func &&h, const _tAlloc &, ystdex::true_)
template<class _tDst , typename _func , class _tAlloc >
YB_ATTR_nodiscard YB_PURE _tDst | WrapContextHandler (_func &&h, const _tAlloc &a)
template<size_t _vWrapping = Strict, class _tTarget , typename... _tParams>
void | RegisterHandler (_tTarget &target, string_view name, _tParams &&... args)
| 注册一般形式上下文处理器。 更多...
template<class _tTarget , typename... _tParams>
void | RegisterForm (_tTarget &target, string_view name, _tParams &&... args)
| 注册一般形式上下文处理器。 更多...
template<class _tTarget , typename... _tParams>
void | RegisterStrict (_tTarget &target, string_view name, _tParams &&... args)
| 注册严格上下文处理器。 更多...
YB_ATTR_nodiscard YB_PURE | PDefH (size_t, FetchArgumentN, const TermNode &term) ynothrowv ImplRet(AssertBranch(term)
| 取项的参数个数：子项数减 1 。 更多...
YB_ATTR_nodiscard YB_PURE term | size () - 1) YF_API ReductionStatus DefaultEvaluateLeaf(TermNode &
| 字面量和数值的叶节点求值默认实现。 更多...
YF_API ReductionStatus | EvaluateIdentifier (TermNode &, const ContextNode &, string_view)
| 求值标识符。 更多...
YF_API ReductionStatus | EvaluateLeafToken (TermNode &, ContextNode &, string_view)
| 求值叶节点记号。 更多...
| PDefH (void, EvaluateLiteralHandler, TermNode &term, const ContextNode &ctx, const TermNode &tm) ImplExpr([&]
| 若第三参数指定的项表示字面量处理器则调用并以结果其正规化第一参数指定的项。 更多...
YB_ATTR_nodiscard YB_PURE | PDefH (bool, IsCombiningTerm, const TermNode &term) ynothrow ImplRet(!(term.empty()||(term.Value &&term.Value.type() !
| 判断项是规约合并项。 更多...
YF_API ReductionStatus | ReduceCombinedBranch (TermNode &, ContextNode &)
| 规约列表合并项：同 ReduceCombined ，但只适用于枝节点。 更多...
YB_FLATTEN | PDefH (ReductionStatus, ReduceNextCombinedBranch, TermNode &term, ContextState &cs) ImplRet(cs.SetNextTermRef(term)
| 规约列表合并项：同 ReduceCombinedBranch ，但先设置 NPLA1 上下文的下一项。 更多...
YB_FLATTEN | ReduceCombinedBranch (term, cs)) YF_API ReductionStatus ReduceCombinedReferent(TermNode &
| 规约列表合并项：同 ReduceCombined ，但使用第三参数指定的值。 更多...
YB_FLATTEN ContextNode const TermNode &YF_API ReductionStatus | ReduceLeafToken (TermNode &, ContextNode &)
| 规约提取名称的叶节点记号。 更多...
YF_API ReductionStatus | RelayForEval (ContextNode &, TermNode &, EnvironmentGuard &&, bool, Continuation)
| 设置当前项并直接求值规约。 更多...
YF_API ReductionStatus | RelayForCall (ContextNode &, TermNode &, EnvironmentGuard &&, bool)
| 函数调用规约（ β-规约）。 更多...
template<typename _func >
auto | CheckSymbol (string_view n, _func f) -> decltype(f())
| 检查记号值是符合匹配条件的符号。 更多...
template<typename _func >
auto | CheckParameterLeafToken (string_view n, _func f) -> decltype(f())
| 检查记号值是符合匹配条件的参数符号。 更多...
YF_API void | MatchParameter (const TermNode &, TermNode &, function< void(TermNode &, TNIter, const TokenValue &, TermTags, const EnvironmentReference &)>, function< void(const TokenValue &, TermNode &, TermTags, const EnvironmentReference &)>, TermTags, const EnvironmentReference &)
| 匹配参数。 更多...
YF_API void | BindParameter (const shared_ptr< Environment > &, const TermNode &, TermNode &)
| 使用操作数结构化匹配并绑定参数。 更多...
YF_API void | SetupDefaultInterpretation (ContextState &, EvaluationPasses)
| 设置默认解释：解释使用的公共处理遍。 更多...
YF_API void | SetupTailContext (ContextNode &, TermNode &)
| 设置参数指定的上下文为尾上下文。 更多...
YB_ATTR_nodiscard YF_API bool | AddTypeNameTableEntry (const ystdex::type_info &, string_view)
| 添加全局类型名称表项。 更多...
template<typename _type >
void | InitializeTypeNameTableEntry (string_view desc)
| 初始化全局类型名称表项。 更多...
template<class _tTarget , typename _func , typename _fCallable >
YB_ATTR_nodiscard YB_PURE _fCallable | NameExpandedHandler (_fCallable &&x, string_view desc)
| 初始化作为扩展调用者的全局类型名称表项并转发参数。 更多...
template<typename _fCallable >
YB_ATTR_nodiscard YB_PURE _fCallable | NameTypedContextHandler (_fCallable &&x, string_view desc)
| 初始化作为上下文处理器的全局类型名称表项并转发参数。 更多...
template<typename _type >
YB_ATTR_nodiscard YB_PURE _type | NameTypedObject (_type &&x, string_view desc)
| 初始化全局类型名称表项并转发参数。 更多...
template<typename _fCallable >
YB_ATTR_nodiscard YB_PURE _fCallable | NameTypedReducerHandler (_fCallable &&x, string_view desc)
| 初始化作为规约器处理器的全局类型名称表项并转发参数。 更多...
YB_ATTR_nodiscard YB_PURE YF_API string_view | QueryContinuationName (const Reducer &)
| 查询续延中的名称信息。 更多...
YB_ATTR_nodiscard YB_PURE YF_API observer_ptr< const SourceInformation > | QuerySourceInformation (const ValueObject &)
| 查询对象中的源代码信息。 更多...
YB_ATTR_nodiscard YB_PURE YF_API observer_ptr< const ValueObject > | QueryTailOperatorName (const Reducer &)
| 查询续延指定的当前尾动作规约的操作符名称项。 更多...
YB_ATTR_nodiscard YB_PURE YF_API string_view | QueryTypeName (const ystdex::type_info &)
| 查询全局类型名称表。 更多...
YF_API bool | SetupTailOperatorName (TermNode &, const ContextNode &)
| 设置当前尾动作规约的操作符名称。 更多...
YSLib::unique_ptr< std::istream > | OpenFile (const char *filename)
YSLib::unique_ptr< std::istream > | OpenUnique (REPLContext &context, string filename)
void | PreloadExternal (REPLContext &context, const char *filename)
ReductionStatus | ReduceToLoadExternal (TermNode &term, ContextNode &ctx, REPLContext &context)
ReductionStatus | RelayToLoadExternal (ContextNode &ctx, TermNode &term, REPLContext &context)
string | to_string (ValueToken vt)
void | ThrowInvalidSyntaxError (const char *str)
void | ThrowUnsupportedLiteralError (const char *id)
void | ThrowValueCategoryErrorForFirstArgument (const TermNode &term)
ReductionStatus | Reduce (TermNode &term, ContextNode &ctx)
ReductionStatus | ReduceOrdered (TermNode &term, ContextNode &ctx)
void | SetupTraceDepth (ContextState &cs, const string &name)
ReductionStatus | DefaultEvaluateLeaf (TermNode &term, string_view id)
ReductionStatus | ReduceCombined (TermNode &term, ContextNode &ctx)
ReductionStatus | ReduceCombinedReferent (TermNode &term, ContextNode &ctx, const TermNode &fm)
EnvironmentReference | FetchTailEnvironmentReference (const TermReference &ref, ContextNode &ctx)
ReductionStatus | ReduceForCombinerRef (TermNode &term, ContextNode &ctx, const TermReference &ref, const ContextHandler &h, size_t n)
YB_FLATTEN | PDefH (void, SetupNextTerm, ContextNode &ctx, TermNode &term) ImplExpr(ContextState
template<typename _fCurrent >
| YB_ATTR (always_inline) inline auto RelayDirect(ContextNode &ctx
template<typename _fCurrent , typename _fNext >
YB_FLATTEN ReductionStatus | RelayCurrentNext (TermNode &term, ContextNode &ctx, _fCurrent &&cur, _fNext &&next)
template<typename _fCurrent , typename _fNext >
YB_FLATTEN ReductionStatus | ReduceCurrentNext (TermNode &term, ContextNode &ctx, _fCurrent &&cur, _fNext &&next)
template<typename _fNext >
ReductionStatus | RelayForEvalOrDirect (ContextNode &ctx, TermNode &term, EnvironmentGuard &&gd, bool no_lift, _fNext &&next)
template<typename _fNext >
ReductionStatus | ReduceSubsequent (TermNode &term, ContextNode &ctx, _fNext &&next)
template<typename _fCurrent >
ReductionStatus | ReduceSubsequentCombinedBranch (TermNode &term, ContextNode &ctx, _fCurrent &&next)

## 变量

| tm
YB_ATTR_nodiscard YB_PURE term | string_view
const char * | name
const char _tParams && | args
_fCurrent && | cur
_fCurrent TermNode &decltype(cur(term, ctx)) | term
YB_ATTR_nodiscard YB_PURE PDefH(TermReference, EnsureLValueReference, const TermReference &ref) ImplRet(TermReference(ref.GetTags() &~TermTags YB_ATTR_nodiscard YB_PURE EnvironmentReference | FetchTailEnvironmentReference (const TermReference &, ContextNode &)

## 详细描述

自从
  build 889
  build 665

## 类型定义说明

## ◆ EnvironmentGuard

using NPL::A1::EnvironmentGuard = typedef ystdex::guard<EnvironmentSwitcher>

求值环境守卫。

自从
  build 876

作用域退出时调用环境切换器恢复保存的环境的作用域守卫。

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

## ◆ EvaluationPasses

using NPL::A1::EvaluationPasses = typedef GPasses<TermNode&, ContextNode&>

求值合并遍。

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

## ◆ GPasses

template<typename... _tParams>

using NPL::A1::GPasses = typedef YSLib::GEvent<ReductionStatus(_tParams...), YSLib::GCombinerInvoker<ReductionStatus, PassesCombiner> >

一般合并遍。

注解
  结果表示判断是否应继续规约。

参见
  PassesCombiner

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

## ◆ GTokenizer

template<typename _fParse >

using NPL::A1::GTokenizer = typedef function<TermNode(const GParsedValue<_fParse>&)>

泛型标记器：分析解析结果元素转换为可能包含记号的节点。

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

## ◆ Guard

using NPL::A1::Guard = typedef any

作用域守卫类型。

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

## ◆ GuardPasses

using NPL::A1::GuardPasses = typedef YSLib::GEvent<Guard(TermNode&, ContextNode&), YSLib::GDefaultLastValueInvoker<Guard> >

作用域守卫遍：用于需在规约例程的入口和出口关联执行的操作。

待办事项:
  支持迭代使用旧值。

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

## ◆ LiteralHandler

using NPL::A1::LiteralHandler = typedef YSLib::GHEvent<ReductionStatus(const ContextNode&)>

字面量处理器类型。

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

## ◆ LiteralPasses

using NPL::A1::LiteralPasses = typedef GPasses<TermNode&, ContextNode&, string_view>

字面量合并遍。

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

自从
  build 738

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

## ◆ SourcedTokenizer

using NPL::A1::SourcedTokenizer = typedef GTokenizer<SourcedByteParser>

标记器：分析带有源代码位置信息的词素转换为可能包含记号的节点。

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

## ◆ TermPasses

using NPL::A1::TermPasses = typedef GPasses<TermNode&>

项合并遍。

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

## ◆ Tokenizer

using NPL::A1::Tokenizer = typedef GTokenizer<ByteParser>

标记器：分析词素转换为可能包含记号的节点。

自从
  build 880

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

## 枚举类型说明

## ◆ WrappingKind

enum NPL::A1::WrappingKind : decltype(FormContextHandler::Wrapping)

包装数种类枚举。

自从
  build 871

注解
  用于指定创建上下文处理器的种类。

枚举值
Form | 一般形式：不对参数求值。
Strict | 严格求值形式：对参数求值 1 次。

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

## 函数说明

## ◆ AddTypeNameTableEntry()

bool NPL::A1::AddTypeNameTableEntry | ( | const ystdex::type_info & | ti,
|  | string_view | sv
| ) |  |

添加全局类型名称表项。

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

注解
  不对名称参数指向的数据具有所有权。一般需要使用字符串字面量。

自从
  build 896

返回
  是否添加成功。

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

引用了 YAssertNonnull.

被这些函数引用 InitializeTypeNameTableEntry().

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

## ◆ BindParameter()

void NPL::A1::BindParameter | ( | const shared_ptr< Environment > & | p_env,
|  | const TermNode & | t,
|  | TermNode & | o
| ) |  |

使用操作数结构化匹配并绑定参数。

前置条件
  间接断言：第一参数非空。

异常

  ArityMismatch | 子项数匹配失败。
  InvalidReference | 非法的 @ 引用标记字符绑定。

注解
  第一参数指定绑定所在的环境。

参见
  MatchParameter
  TermReference

自从
  build 894

形式参数和操作数为项指定的表达式树。 第二参数指定形式参数，第三参数指定操作数。 进行匹配的算法递归搜索形式参数及其子项，要求参见 MatchParameter 。 若匹配成功，在第一参数指定的环境内绑定未被忽略的匹配的项。 对结尾序列总是匹配前缀为 . 的符号为目标按以下规则忽略或绑定： 子项为 . 时，对应操作数的结尾序列被忽略； 否则，绑定项的目标为移除前缀 . 和后续可选前缀 & 后的符号。 非列表项的绑定使用以下规则： 若匹配成功，在第一参数指定的环境内绑定未被忽略的匹配的非列表项。 匹配要求如下： 若项是 #ignore ，则忽略操作数对应的项； 若项的值是符号，则操作数的对应的项应为非列表项。 若被绑定的目标有引用标记字符，则以按引用传递的方式绑定；否则以按值传递的方式绑定。 当绑定的引用标记字符为 @ 且不是列表项时抛出异常。 按引用传递绑定直接转移该项的内容。

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

引用了 ystdex::begins_with(), CHRLib::c, CheckParameterLeafToken(), platform::Deref(), ystdex::fseq::front, string_view, platform_ex::Windows::Temporary, tm, YSLib::vo , 以及 NPL::YAssert().

函数调用图:

## ◆ CheckParameterLeafToken()

template<typename _func >

auto NPL::A1::CheckParameterLeafToken | ( | string_view | n,
|  | _func | f
| ) |  | -> decltype(f())

检查记号值是符合匹配条件的参数符号。

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

引用了 CheckSymbol() , 以及 CHRLib::f().

被这些函数引用 BindParameter().

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

## ◆ CheckSymbol()

template<typename _func >

auto NPL::A1::CheckSymbol | ( | string_view | n,
|  | _func | f
| ) |  | -> decltype(f())

检查记号值是符合匹配条件的符号。

异常

  ParameterMismatch | 匹配失败。

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

自从
  build 794

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

引用了 CHRLib::f() , 以及 ystdex::sfmt().

被这些函数引用 CheckParameterLeafToken() , 以及 NPL::A1::Forms::LoadModule_std_environments().

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

## ◆ DefaultEvaluateLeaf()

ReductionStatus NPL::A1::DefaultEvaluateLeaf | ( | TermNode & | term,
|  | string_view | id
| ) |  |

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

引用了 ystdex::cpp2017::begin(), NPL::Clean, ystdex::cpp2017::data(), CHRLib::f(), ystdex::fseq::front, ystdex::isdigit(), platform::p, NPL::Retrying, ystdex::sfmt(), NPL::A1::Internals::term, ThrowInvalidSyntaxError(), Unspecified , 以及 YAssertNonnull.

被这些函数引用 ParseLeaf() , 以及 ParseLeafWithSourceInformation().

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

## ◆ end()

term NPL::A1::end | ( |  | ) |

## ◆ EvaluateIdentifier()

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

求值标识符。

异常

  BadIdentifier | 未在环境中找到指定标识符的绑定。

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

参见
  LiteralHandler
  ReferenceTerm
  ResolveIdentifier
  SetupTailOperatorName
  TermReference

自从
  build 745

根据第三参数指定的标识符求值，保存结果到第一参数指定的目标项中。 标识符通常来自对象语言中的名称表达式。求值标识符即对先前保存此标识符的项求值： 解析名称并初始化目标项的值；然后检查字面量处理器，若存在则调用。 具体依次进行以下求值操作： 调用 ResolveIdentifier 解析指定的标识符，若失败则抛出异常； 调用 SetupTailOperatorName 检查操作符项，可能设置第一参数的值数据成员； 解析的结果进行引用折叠后重新引用为左值，并赋值到第一参数指定的项的值数据成员； 以 LiteralHandler 访问字面量处理器，若成功调用并返回字面量处理器的处理结果； 否则，返回 ReductionStatus::Neutral 。 其中 ResolveIdentifier 包含的引用折叠确保不引入引用的引用； 只有解析结果自身是未折叠的引用值时，求值标识符的结果才可能是未折叠的引用值。 确保左值引用的操作总是去除解析结果的标签中的 TermTags::Unique ， 以保证求值结果不是消亡值； 这个过程不移除 TermTags::Temporary ，之后可区分指称的被绑定的对象是否为临时对象。 关于保留标签的用法，参见 TermReference::IsReferencedLValue ； 一般地，因为无法保留消亡值，不使用 EvaluateIdentifier 而用基于调用 ResolveIdentifier 的（不排除 TermTags::Uniuqe ）的方式与之配合取得结果。

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

引用了 NPL::Neutral, platform::Nonnull(), platform::p, SetupTailOperatorName(), NPL::A1::Internals::term , 以及 YB_FLATTEN.

被这些函数引用 EvaluateLeafToken() , 以及 NPL::A1::Forms::ValueOf().

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

## ◆ EvaluateLeafToken()

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

求值叶节点记号。

前置条件
  第二参数引用的对象是 NPLA1 上下文状态或 public 继承的派生类。

返回
  求值标识符的结果或 ReductionStatus::Retained 。

异常

  InvalidSyntax | 语法错误：作为符号的记号是不被支持的扩展字面量。

警告
  若不满足上下文状态类型要求，行为未定义。

参见
  CategorizeLexeme
  ContextNode::EvaluateLiteral
  DeliteralizeUnchecked
  EvaluateIdentifier
  ThrowUnsupportedLiteralError

自从
  build 736

处理非空字符串表示的节点记号。 被处理的记号视为符号。 若字面量遍非空，通过调用字面量遍处理记号。 若字面量遍为空或要求重规约，且记号不是不被支持的扩展字面量，求值非字面量的标识符。

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

引用了 NPL::A1::ContextState::Access, NPL::CheckReducible(), ystdex::cpp2017::data(), EvaluateIdentifier(), NPL::IsNPLAExtendedLiteral(), NPL::Retained, NPL::A1::Internals::term, ThrowUnsupportedLiteralError() , 以及 YAssertNonnull.

被这些函数引用 ReduceLeafToken().

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

## ◆ InitializeTypeNameTableEntry()

template<typename _type >

void NPL::A1::InitializeTypeNameTableEntry | ( | string_view | desc | ) |

inline

初始化全局类型名称表项。

前置条件
  类型在全局类型名称表中非重复。

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

引用了 AddTypeNameTableEntry(), string_view, NPL::YAssert(), YAssertNonnull , 以及 NPL::yunused().

被这些函数引用 NameExpandedHandler().

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

## ◆ InsertChild()

YF_API void NPL::A1::InsertChild | ( | ValueNode && | node,
|  | ValueNode::Container & | con
| ) |  |

插入 NPLA1 子节点。

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

自从
  build 852

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

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

引用了 YSLib::AsNode(), ystdex::mapped_set< _type, _fComp, _tTraits, _tAlloc >::insert(), YSLib::MakeIndex() , 以及 ystdex::mapped_set< _type, _fComp, _tTraits, _tAlloc >::size().

函数调用图:

## ◆ LoadNode()

template<typename _type , typename... _tParams>

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

加载 NPLA1 翻译单元。

异常

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

自从
  build 665

在文件 NPL/Configuration.h 第 48 行定义.

引用了 args, CatchThrow, CHRLib::e, ystdex::sfmt(), TransformNode(), TryRet, platform::Descriptions::Warning , 以及 yforward.

被这些函数引用 YSLib::FetchMIMEBiMapping(), YSLib::UI::WidgetLoader::LoadUILayout() , 以及 NPL::operator>>().

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

## ◆ MatchParameter()

void NPL::A1::MatchParameter | ( | const TermNode & | t,
|  | TermNode & | o,
|  | function< void(TermNode &, TNIter, const TokenValue &, TermTags, const EnvironmentReference &)> | bind_trailing_seq,
|  | function< void(const TokenValue &, TermNode &, TermTags, const EnvironmentReference &)> | bind_value,
|  | TermTags | o_tags,
|  | const EnvironmentReference & | r_env
| ) |  |

匹配参数。

注解
  不具有强异常安全保证。匹配失败时，其它的绑定状态未指定。

递归遍历参数和操作数树进行结构化匹配。 若匹配失败，则抛出异常。

异常

  std::bad_function_call | 异常中立：参数指定的处理器为空。

参见
  TermTags

自从
  build 898

进行匹配的算法递归搜索形式参数及其子项。 若匹配成功，调用参数指定的匹配处理器。 参数指定形式参数、实际参数、两个处理器、绑定选项和引用值关联的环境。 其中，形式参数被视为作为形式参数树的右值。 绑定选项以 TermTags 编码，但含义和作用在项上时不完全相同： Unique 表示唯一引用项（在此即消亡值值）； Nonmodifying 表示需要复制； Temporary 表示不被共享的项（在此即纯右值或没有匹配列表的引用值）。 当需要复制时，递归处理的所有对实际参数的绑定以复制代替转移； 可能被共享的项在发现表达数树中存在需被匹配的列表后失效，对之后的子项进行递归处理。 以上处理的操作数的子项仅在确定参数对应位置是列表时进行。 处理器为参数列表结尾的结尾序列处理器和值处理器，分别匹配以 . 起始的项和非列表项。 处理器参数列表中的记号值为匹配的名称； 处理器最后的参数指定按值传递时的复制（而非转移）； 其余参数指定被匹配的操作数子项。 其中，序列处理器的前两个参数指定操作数项和起始迭代器； 操作数子项以起始迭代器到项的容器终止作为范围。 若操作数的某一个需匹配的列表子项是 TermReference 或复制标识为 true ， 序列处理器中需要进行复制。 结尾序列处理器传入的字符串参数表示需绑定的表示结尾序列的列表标识符。 匹配要求如下： 若项是非空列表，则操作数的对应的项应为满足确定子项数的列表： 若最后的子项为 . 起始的符号，则匹配操作数中结尾的任意个数的项作为结尾序列： 其它子项一一匹配操作数的子项； 若项是空列表，则操作数的对应的项应为空列表； 若项是 TermReference ，则以其引用的项作为子项继续匹配； 否则，匹配非列表项。

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

## ◆ NameExpandedHandler()

template<class _tTarget , typename _func , typename _fCallable >

YB_ATTR_nodiscard YB_PURE _fCallable NPL::A1::NameExpandedHandler | ( | _fCallable && | x,
|  | string_view | desc
| ) |  |

inline

初始化作为扩展调用者的全局类型名称表项并转发参数。

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

引用了 InitializeTypeNameTableEntry(), x , 以及 yforward.

被这些函数引用 NameTypedContextHandler() , 以及 NameTypedReducerHandler().

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

## ◆ NameTypedContextHandler()

template<typename _fCallable >

YB_ATTR_nodiscard YB_PURE _fCallable NPL::A1::NameTypedContextHandler | ( | _fCallable && | x,
|  | string_view | desc
| ) |  |

inline

初始化作为上下文处理器的全局类型名称表项并转发参数。

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

引用了 NameExpandedHandler(), x , 以及 yforward.

被这些函数引用 NPL::A1::Internals::RelayForEvalOrDirect().

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

## ◆ NameTypedObject()

template<typename _type >

YB_ATTR_nodiscard YB_PURE _type NPL::A1::NameTypedObject | ( | _type && | x,
|  | string_view | desc
| ) |  |

inline

初始化全局类型名称表项并转发参数。

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

引用了 x , 以及 yforward.

## ◆ NameTypedReducerHandler()

template<typename _fCallable >

YB_ATTR_nodiscard YB_PURE _fCallable NPL::A1::NameTypedReducerHandler | ( | _fCallable && | x,
|  | string_view | desc
| ) |  |

inline

初始化作为规约器处理器的全局类型名称表项并转发参数。

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

引用了 NameExpandedHandler(), x , 以及 yforward.

被这些函数引用 NPL::A1::Forms::ForwardListFirst(), NPL::A1::Forms::If(), ReduceOrdered(), RelayToLoadExternal() , 以及 SetupDefaultInterpretation().

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

## ◆ OpenFile()

YSLib::unique_ptr<std::istream> NPL::A1::OpenFile | ( | const char * | filename | ) |

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

引用了 YSLib::Text::BOM_UTF_8.

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

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

## ◆ OpenUnique()

YSLib::unique_ptr<std::istream> NPL::A1::OpenUnique | ( | REPLContext & | context,
|  | string | filename
| ) |  |

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

引用了 NPL::A1::REPLContext::CurrentSource, OpenFile() , 以及 ystdex::share_move().

被这些函数引用 NPL::c_str(), NPL::A1::REPLContext::DefaultLoad(), NPL::A1::Forms::LoadModule_std_io() , 以及 PreloadExternal().

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

## ◆ ParseLeaf()

TermNode NPL::A1::ParseLeaf | ( | string_view | id,
|  | TermNode::allocator_type | a
| ) |  |

分析参数指定的叶节点词素。

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

返回
  分析结果。

自从
  build 880

以第二参数初始化空项，依次进行以下转换操作确定值数据成员后返回： 对代码字面量，去除字面量边界分隔符后进一步求值； 对数据字面量，去除字面量边界分隔符作为字符串值； 对其它字面量，转换为符号。

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

引用了 YSLib::a, NPL::AsTermNode(), NPL::CategorizeBasicLexeme(), NPL::CheckReducible(), NPL::Code, ystdex::cpp2017::data(), NPL::Data, DefaultEvaluateLeaf(), NPL::Deliteralize, NPL::Symbol, NPL::A1::Internals::term, YAssertNonnull , 以及 YB_ATTR_fallthrough.

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

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

## ◆ ParseLeafWithSourceInformation()

TermNode NPL::A1::ParseLeafWithSourceInformation | ( | string_view | id,
|  | const shared_ptr< string > & | name,
|  | const SourceLocation & | src_loc,
|  | TermNode::allocator_type | a
| ) |  |

分析参数指定的带有源代码信息和叶节点词素。

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

自从
  build 891

同 ParseLeaf ，但同时在分析结果的记号中包含源代码信息。 第二参数表示源代码来源。 第三参数表示记号在源代码中的位置。

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

引用了 YSLib::a, NPL::AsTermNode(), NPL::CategorizeBasicLexeme(), NPL::CheckReducible(), NPL::Code, ystdex::cpp2017::data(), NPL::Data, DefaultEvaluateLeaf(), NPL::Deliteralize, ystdex::cpp2017::in_place_type, name, NPL::Symbol, NPL::A1::Internals::term, ystdex::any_ops::use_holder, YAssertNonnull , 以及 YB_ATTR_fallthrough.

函数调用图:

## ◆ PDefH() [1/11]

YB_ATTR_nodiscard YB_PURE NPL::A1::PDefH | ( | bool | ,
|  | IsCombiningTerm | ,
|  | const TermNode & | term
| ) |  | &&

inline

判断项是规约合并项。

自从
  build 895

## ◆ PDefH() [2/11]

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

inline

## ◆ PDefH() [3/11]

YB_FLATTEN NPL::A1::PDefH | ( | ReductionStatus | ,
|  | ReduceNextCombinedBranch | ,
|  | TermNode & | term,
|  | ContextState & | cs
| ) |  |

inline

规约列表合并项：同 ReduceCombinedBranch ，但先设置 NPLA1 上下文的下一项。

前置条件
  间接断言：项满足 IsCombiningTerm 。

自从
  build 884

## ◆ PDefH() [4/11]

NPL::A1::PDefH | ( | ReductionStatus | ,
|  | ReduceOnceLifted | ,
|  | TermNode & | term,
|  | ContextNode & | ctx,
|  | TermNode & | tm
| ) |  |

inline

再次规约提升后的项。

前置条件
  间接断言：第一和第三参数指定不相同的项。

返回
  同 ReduceOnce 。

参见
  LiftOther
  ReduceOnce

自从
  build 869

调用 LiftOther 提升项，再调用 ReduceOnce 规约。

## ◆ PDefH() [5/11]

NPL::A1::PDefH | ( | ReductionStatus | ,
|  | ReduceReturnUnspecified | ,
|  | TermNode & | term
| ) |  |

inline

规约至确定的未指定值。

参见
  ValueToken::Unspecified

自从
  build 896

## ◆ PDefH() [6/11]

YB_ATTR_nodiscard YB_PURE NPL::A1::PDefH | ( | size_t | ,
|  | FetchArgumentN | ,
|  | const TermNode & | term
| ) |  |

inline

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

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

返回
  项作为列表操作数被匹配的最大实际参数的个数。

自从
  build 733

## ◆ PDefH() [7/11]

NPL::A1::PDefH | ( | void | ,
|  | EvaluateLiteralHandler | ,
|  | TermNode & | term,
|  | const ContextNode & | ctx,
|  | const TermNode & | tm
| ) |  | &

inline

若第三参数指定的项表示字面量处理器则调用并以结果其正规化第一参数指定的项。

参见
  LiteralHandler
  RegularizeTerm

自从
  build 883

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

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

函数调用图:

## ◆ PDefH() [8/11]

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

inline

## ◆ PDefH() [9/11]

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

inline

## ◆ PDefH() [11/11]

YB_NORETURN NPL::A1::PDefH | ( | void | ,
|  | ThrowUnsupportedLiteralError | ,
|  | string_view | sv
| ) |  | const &

inline

抛出第一参数不符合预期值类别的异常。

异常

  ValueCategory | 第一参数值类别错误。

## ◆ PreloadExternal()

void NPL::A1::PreloadExternal | ( | REPLContext & | context,
|  | const char * | filename
| ) |  |

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

引用了 NPL::A1::REPLContext::Allocator , 以及 OpenUnique().

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

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

## ◆ QueryContinuationName()

string_view NPL::A1::QueryContinuationName | ( | const Reducer & | act | ) |

查询续延中的名称信息。

返回
  若存在名称则为内部指定来源的名称字符串，否则是数据指针为空的结果。

参见
  InitializeTypeNameTableEntry
  QueryTypeName

自从
  build 893

取参数指定的动作对应的续延中的名称信息。 支持的目标类型包括： 特定目标的 Continuation ； TCO 动作； 特定的其它实现续延的内部类型。 若非特定目标类型，使用全局类型名称表查询。 实现和用户操作全局类型名称表直接添加的类型信息不冲突。

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

引用了 act, QueryTypeName() , 以及 ReduceCombined().

函数调用图:

## ◆ QuerySourceInformation()

observer_ptr< const SourceInformation > NPL::A1::QuerySourceInformation | ( | const ValueObject & | vo | ) |

查询对象中的源代码信息。

自从
  build 891

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

引用了 ystdex::call_value_or(), ystdex::make_observer(), YSLib::Drawing::r, YSLib::vo , 以及 ynothrow.

被这些函数引用 ReduceLeafToken().

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

## ◆ QueryTailOperatorName()

observer_ptr< const ValueObject > NPL::A1::QueryTailOperatorName | ( | const Reducer & | act | ) |

查询续延指定的当前尾动作规约的操作符名称项。

注解
  当参数指定 TCO 时且保存记号值时保存的值即为名称，否则名称不存在。

返回
  若存在名称则为内部保存的名称字符串，否则是数据指针为空的结果。

注解
  仅在 TCO 动作存在时支持。

自从
  build 896

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

引用了 act, ystdex::make_observer() , 以及 NPL::yunused().

函数调用图:

## ◆ QueryTypeName()

string_view NPL::A1::QueryTypeName | ( | const ystdex::type_info & | ti | ) |

查询全局类型名称表。

自从
  build 896

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

引用了 YSLib::i.

被这些函数引用 QueryContinuationName().

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

## ◆ Reduce()

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

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

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

被这些函数引用 NPL::A1::REPLContext::LoadFrom() , 以及 NPL::A1::REPLContext::Perform().

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

## ◆ ReduceArguments()

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

inline

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

前置条件
  ContextNode& 类型的参数引用的对象是 NPLA1 上下文状态或 public 继承的派生类。

注解
  第一参数为 TermNode& 类型时，引用的对象为被规约项。

警告
  若不满足上下文状态类型要求，行为未定义。

返回
  规约状态。

参见
  ContextState::RewriteGuarded
  ReduceOnce

自从
  build 730

以 ReduceOnce 为规约动作调用 ContextState::RewriteGuarded 作为跳板进行重写。 这里的跳板对异步实现是必要的。 同时，在调用时对必要的异步状态（当前上下文的动作）进行保护， 允许同步和异步的规约的本机实现混合调用。

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

参见
  Reduce

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

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

异常

  InvalidSyntax | 容器为空。

参见
  ReduceChildren

自从
  build 773

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

引用了 ReduceChildren() , 以及 ThrowInvalidSyntaxError().

函数调用图:

## ◆ ReduceChildren()

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

规约子项。

自从
  build 697

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

引用了 ystdex::bind1(), ReduceOnce() , 以及 ystdex::ref().

被这些函数引用 ReduceArguments().

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

## ◆ ReduceChildrenOrdered()

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

有序规约子项。

前置条件
  断言：参数指定的范围不存在子项或参数指定的上下文中的尾动作为空。

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

参见
  ReduceOnce

自从
  build 773

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

引用了 YSLib::i, NPL::Neutral , 以及 ReduceOnce().

被这些函数引用 ReduceOrdered().

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

## ◆ ReduceCombined()

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

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

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

被这些函数引用 QueryContinuationName() , 以及 SetupDefaultInterpretation().

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

## ◆ ReduceCombinedBranch() [1/2]

YB_FLATTEN NPL::A1::ReduceCombinedBranch | ( | term | ,
|  | cs |
| ) |  | &

规约列表合并项：同 ReduceCombined ，但使用第三参数指定的值。

注解
  若第三参数不表示上下文处理器的宿主值，抛出的异常消息指定其为引用项。

自从
  build 883

## ◆ ReduceCombinedBranch() [2/2]

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

规约列表合并项：同 ReduceCombined ，但只适用于枝节点。

前置条件
  断言：项满足 IsCombiningTerm 。

自从
  build 882

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

引用了 NPL::Access(), NPL::c_str(), platform::Deref(), NPL::IsLeaf, platform::p, NPL::ResolveTerm(), ystdex::sfmt(), ystdex::share_move(), platform_ex::Windows::Temporary, NPL::A1::Internals::term, NPL::TermToStringWithReferenceMark(), NPL::YAssert() , 以及 YB_ATTR_LAMBDA.

被这些函数引用 ReduceCombined(), NPL::A1::Internals::ReduceSubsequentCombinedBranch() , 以及 SetupDefaultInterpretation().

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

## ◆ ReduceCombinedReferent()

ReductionStatus NPL::A1::ReduceCombinedReferent | ( | TermNode & | term,
|  | ContextNode & | ctx,
|  | const TermNode & | fm
| ) |  |

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

引用了 NPL::c_str(), ystdex::sfmt(), platform_ex::Windows::Temporary, NPL::A1::Internals::term , 以及 NPL::TermToStringWithReferenceMark().

函数调用图:

## ◆ ReduceFirst()

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

规约第一个子项。

返回
  规约状态。

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

自从
  build 730

快速严格性分析： 当节点为分支列表的节点时，无条件求值第一项以避免非确定性推断子表达式求值的附加复杂度； 否则，返回 ReductionStatus::Regular 。 调用 ReduceOnce 规约子项。

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

引用了 NPL::IsBranchedList, ReduceOnce(), NPL::Regular , 以及 NPL::A1::Internals::term.

被这些函数引用 SetupDefaultInterpretation().

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

## ◆ ReduceLeafToken()

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

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

异常

  BadIdentifier | 标识符未声明。

注解
  忽略名称查找失败，默认结果为 ReductionStatus::Retained 。
  当抛出 BadIdentifier 异常时，无条件查询源代码信息，若存在则设置到异常对像。

参见
  EvaluateLeafToken
  QuerySourceInformation
  ReduceOnce
  TermToNamePtr

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

引用了 ystdex::call_value_or(), NPL::CheckReducible(), CHRLib::e, EvaluateLeafToken(), QuerySourceInformation(), ReduceOnce(), NPL::Retained, string_view, NPL::A1::Internals::term, NPL::TermToNamePtr() , 以及 TryRet.

被这些函数引用 SetupDefaultInterpretation().

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

## ◆ ReduceOnce() [1/2]

NPL::A1::ReduceOnce | ( | term | ,
|  | ctx |
| ) |  | &

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

参见
  ReduceChildrenOrdered

自从
  build 764

## ◆ ReduceOnce() [2/2]

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

NPLA1 表达式节点一次规约：转发调用到 NPLA1 表达式节点一次规约续延并调用。

前置条件
  第二参数引用的对象是 NPLA1 上下文状态或 public 继承的派生类。

返回
  规约状态。

注解
  默认实现由 ContextState::DefaultReduceOnce 提供。
  异常安全和参数的要求同默认实现。

警告
  若不满足上下文状态类型要求，行为未定义。

参见
  ContextState::DefaultReduceOnce
  ContextState::ReduceOnce

自从
  build 806

转换第二参数为 NPLA1 上下文状态引用，访问其中的 NPLA1 表达式节点一次规约续延并调用。 若使用异步实现，在尾上下文支持尾调用优化。

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

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

被这些函数引用 NPL::A1::Forms::Cond(), ReduceChildren(), ReduceChildrenOrdered(), ReduceFirst(), ReduceLeafToken(), NPL::A1::Internals::ReduceSubsequent(), ReduceTail(), ReduceToLoadExternal() , 以及 RelayForCall().

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

## ◆ ReduceOrdered()

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

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

引用了 NameTypedReducerHandler(), ReduceChildrenOrdered(), NPL::A1::Internals::ReduceCurrentNext(), NPL::Regular, NPL::Retained, NPL::A1::Internals::term , 以及 Unspecified.

被这些函数引用 NPL::A1::Forms::Sequence().

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

## ◆ ReduceTail()

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

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

前置条件
  断言：参数指定的上下文中的尾动作为空。

返回
  ReductionStatus::Partial 。

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

参见
  ReduceOnce

自从
  build 733

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

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

函数调用图:

## ◆ ReduceToLoadExternal()

ReductionStatus NPL::A1::ReduceToLoadExternal | ( | TermNode & | term,
|  | ContextNode & | ctx,
|  | REPLContext & | context
| ) |  |

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

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

被这些函数引用 NPL::c_str(), NPL::A1::Forms::LoadModule_std_io() , 以及 RelayToLoadExternal().

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

## ◆ RegisterForm()

template<class _tTarget , typename... _tParams>

void NPL::A1::RegisterForm | ( | _tTarget & | target,
|  | string_view | name,
|  | _tParams &&... | args
| ) |  |

inline

注册一般形式上下文处理器。

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

自从
  build 838

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

引用了 args, name , 以及 yforward.

## ◆ RegisterHandler()

template<size_t _vWrapping = Strict, class _tTarget , typename... _tParams>

void NPL::A1::RegisterHandler | ( | _tTarget & | target,
|  | string_view | name,
|  | _tParams &&... | args
| ) |  |

inline

注册一般形式上下文处理器。

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

注册一般形式上下文处理器。

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

引用了 args, name , 以及 yforward.

## ◆ RegisterStrict()

template<class _tTarget , typename... _tParams>

void NPL::A1::RegisterStrict | ( | _tTarget & | target,
|  | string_view | name,
|  | _tParams &&... | args
| ) |  |

inline

注册严格上下文处理器。

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

引用了 args, name , 以及 yforward.

被这些函数引用 NPL::A1::Forms::LoadModule_SHBuild(), NPL::A1::Forms::LoadModule_std_environments(), NPL::A1::Forms::LoadModule_std_io(), NPL::A1::Forms::LoadModule_std_strings() , 以及 NPL::A1::Forms::LoadModule_std_system().

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

## ◆ RelayForCall()

ReductionStatus NPL::A1::RelayForCall | ( | ContextNode & | ctx,
|  | TermNode & | term,
|  | EnvironmentGuard && | gd,
|  | bool | no_lift
| ) |  |

函数调用规约（ β-规约）。

前置条件
  不存在临时函数或已通过 ReduceCombined 的内部实现调用被适当保存。

自从
  build 876

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

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

函数调用图:

## ◆ RelayForEval()

ReductionStatus NPL::A1::RelayForEval | ( | ContextNode & | ctx,
|  | TermNode & | term,
|  | EnvironmentGuard && | gd,
|  | bool | no_lift,
|  | Continuation | next
| ) |  |

设置当前项并直接求值规约。

前置条件
  ContextNode& 类型的参数引用的对象是 NPLA1 上下文状态或 public 继承的派生类。
  对 TCO 实现，存在 TCOAction 当前动作。

注解
  参数分别表示规约上下文、被规约的项和待被保存的当前求值环境守卫。
  第四参数指定避免规约后提升结果。
  对 TCO 实现利用 TCOAction 以尾上下文进行规约。

警告
  若不满足上下文状态类型要求，行为未定义。

自从
  build 876

注解
  第五参数指定下一个动作的续延。

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

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

函数调用图:

## ◆ RelayToLoadExternal()

ReductionStatus NPL::A1::RelayToLoadExternal | ( | ContextNode & | ctx,
|  | TermNode & | term,
|  | REPLContext & | context
| ) |  |

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

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

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

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

## ◆ SetupDefaultInterpretation()

void NPL::A1::SetupDefaultInterpretation | ( | ContextState & | cs,
|  | EvaluationPasses | passes
| ) |  |

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

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

参见
  ReduceCombined
  ReduceFirst
  ReduceHeadEmptyList
  ReduceLeafToken

自从
  build 842

设置默认解释的求值遍到第一参数指定的上下文的列表求值遍和叶求值遍中。 列表求值遍等效第二参数后依次添加 ReduceFirst 、ReduceHeadEmptyList 和 ReduceCombined ，但不保证分别作为单独的遍添加。 叶求值遍设置为 ReduceLeafToken 。

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

引用了 NPL::Access(), NPL::Clean, NPL::A1::ContextState::EvaluateLeaf, NPL::A1::ContextState::EvaluateList, NPL::IsBranchedList, NameTypedReducerHandler(), ReduceCombined(), ReduceCombinedBranch(), ReduceFirst(), NPL::ReduceHeadEmptyList(), ReduceLeafToken(), NPL::A1::Internals::ReduceSubsequent(), ystdex::ref() , 以及 NPL::A1::Internals::term.

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

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

## ◆ SetupTailContext()

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

设置参数指定的上下文为尾上下文。

注解
  在不支持 TCO 的实现忽略。

自从
  build 895

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

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

函数调用图:

## ◆ SetupTailOperatorName()

bool NPL::A1::SetupTailOperatorName | ( | TermNode & | term,
|  | const ContextNode & | ctx
| ) |  |

设置当前尾动作规约的操作符名称。

返回
  是否成功。

警告
  若不满足上下文状态类型要求，行为未定义。

参见
  ContextState::GetCombiningTermPtr

自从
  build 896

检查第一参数指定的项是否同第二参数保存的规约合并项的第一项，若成功视为操作符项， 并转移操作符项的值数据成员到规约合并项。

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

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

被这些函数引用 EvaluateIdentifier().

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

## ◆ SetupTraceDepth()

void NPL::A1::SetupTraceDepth | ( | ContextState & | cs,
|  | const string & | name
| ) |  |

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

引用了 NPL::A1::ContextState::Guard, name, YSLib::NoContainer, platform::p, NPL::ContextNode::ShareRecord, NPL::A1::Internals::term, YSLib::ValueNode::ThrowWrongNameFound() , 以及 ystdex::try_emplace().

函数调用图:

## ◆ size()

YB_ATTR_nodiscard YB_PURE term NPL::A1::size | ( |  | ) | &

字面量和数值的叶节点求值默认实现。

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

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

返回
  是否成功求值得到字面量或数值。

异常

  InvalidSyntax | 语法错误：第二参数是不被支持的数值。

参见
  ContextState::EvaluateLiteral

自从
  build 880

判断第二参数是否可被解析和为被 NPLA1 对象语言语法支持的字面量或数值。 返回 ReductionStatus::Clean 表示成功求值。 返回 ReductionStatus::Retrying 表示不成功求值，需进一步被作为符号处理。 可实现字面量遍。

## ◆ ThrowInsufficientTermsError()

void NPL::A1::ThrowInsufficientTermsError | ( |  | ) |

抛出缺少项的异常。

自从
  build 859

异常

  ParameterMismatch | 缺少项的错误。

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

被这些函数引用 NPL::A1::Forms::ForwardListFirst().

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

## ◆ ThrowInvalidSyntaxError() [1/2]

void NPL::A1::ThrowInvalidSyntaxError | ( | const char * | str | ) |

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

引用了 YSLib::str.

## ◆ ThrowInvalidSyntaxError() [2/2]

void NPL::A1::ThrowInvalidSyntaxError | ( | string_view | sv | ) |

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

被这些函数引用 NPL::A1::Forms::Apply(), DefaultEvaluateLeaf(), NPL::A1::Forms::If() , 以及 ReduceArguments().

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

## ◆ ThrowNonmodifiableErrorForAssignee()

void NPL::A1::ThrowNonmodifiableErrorForAssignee | ( |  | ) |

抛出被赋值操作数不可修改的异常。

异常

  TypeError | 被赋值操作数不可修改错误。

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

被这些函数引用 NPL::A1::Forms::LoadModule_std_strings().

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

## ◆ ThrowUnsupportedLiteralError()

void NPL::A1::ThrowUnsupportedLiteralError | ( | const char * | id | ) |

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

引用了 ystdex::sfmt().

被这些函数引用 EvaluateLeafToken().

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

## ◆ ThrowValueCategoryErrorForFirstArgument()

void NPL::A1::ThrowValueCategoryErrorForFirstArgument | ( | const TermNode & | term | ) |

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

引用了 NPL::c_str(), ystdex::sfmt(), NPL::A1::Internals::term , 以及 NPL::TermToString().

函数调用图:

## ◆ to_string()

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

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

引用了 CHRLib::CharSet::Null.

## ◆ TransformNode()

ValueNode NPL::A1::TransformNode | ( | const TermNode & | term | ) |

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

异常

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

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

参见
  InsertChild
  MapNPLALeafNode
  ParseNPLATermString

自从
  build 897

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

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

引用了 YSLib::AsNode(), YSLib::i, NPL::MapNPLALeafNode(), name, NPL::ParseNPLATermString(), CHRLib::s, NPL::A1::Internals::term, tm , 以及 yunseq.

被这些函数引用 LoadNode().

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

## ◆ WrapContextHandler() [1/6]

template<class _tDst , typename _func >

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

inline

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

引用了 yforward.

## ◆ WrapContextHandler() [2/6]

template<class , typename _func , class _tAlloc >

YB_ATTR_nodiscard YB_PURE _func NPL::A1::WrapContextHandler | ( | _func && | h,
|  | const _tAlloc & | ,
|  | ystdex::true_ |
| ) |  |

inline

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

引用了 yforward.

## ◆ WrapContextHandler() [3/6]

template<class _tDst , typename _func , class _tAlloc >

YB_ATTR_nodiscard YB_PURE _tDst NPL::A1::WrapContextHandler | ( | _func && | h,
|  | const _tAlloc & | a
| ) |  |

inline

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

引用了 YSLib::a , 以及 yforward.

## ◆ WrapContextHandler() [4/6]

template<class _tDst , typename _func , class _tAlloc >

YB_ATTR_nodiscard YB_PURE _tDst NPL::A1::WrapContextHandler | ( | _func && | h,
|  | const _tAlloc & | a,
|  | ystdex::false_ |
| ) |  |

inline

自从
  build 886

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

引用了 YSLib::a , 以及 yforward.

## ◆ WrapContextHandler() [5/6]

template<class _tDst , typename _func >

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

inline

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

引用了 yforward.

## ◆ WrapContextHandler() [6/6]

template<class , typename _func >

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

inline

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

引用了 yforward.

## ◆ YB_NONNULL()

YB_NORETURN YF_API NPL::A1::YB_NONNULL | ( | 1 |  | ) | const

抛出参数指定消息的语法错误异常。

抛出参数指定值的不支持的字面量语法错误异常。

异常

  InvalidSyntax | 语法错误：参数指定的标识符是不被支持的字面量。

前置条件
  间接断言：第一参数非空。

异常

  InvalidSyntax | 语法错误。

自从
  build 896

前置条件
  间接断言：第一参数非空。

## 变量说明

## ◆ args

const char _tParams&& NPL::A1::args

初始值:
{
TryExpr(context.LoadFrom(yforward(args)...))
CatchExpr(..., std::throw_with_nested(NPLException(
ystdex::sfmt("Failed loading external unit '%s'.", name))))

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

被这些函数引用 NPL::A1::Forms::CallBinary(), NPL::A1::Forms::CallBinaryAs(), NPL::A1::Forms::CallBinaryFold(), NPL::A1::Forms::CallRawUnary(), NPL::A1::Forms::CallRegularUnaryAs(), NPL::A1::Forms::CallResolvedUnaryAs(), NPL::A1::Forms::CallUnary(), NPL::A1::Forms::CallUnaryAs(), NPL::A1::WrappedContextHandler< _func >::DefDeCopyMoveCtorAssignment(), NPL::A1::REPLContext::FetchContextParameter(), NPL::A1::REPLContext::LoadFrom(), LoadNode(), NPL::A1::REPLContext::Perform(), NPL::A1::REPLContext::ReadFrom(), RegisterForm(), RegisterHandler(), RegisterStrict(), NPL::A1::REPLContext::ShareCurrentSource() , 以及 NPL::A1::REPLContext::std::move().

## ◆ name

const char* NPL::A1::name

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

被这些函数引用 YSLib::AccessNode(), YSLib::AccessNodePtr(), YReader::AddButtonToTabBar(), YSLib::NodeLiteral::AsNodeLiteral(), NPL::DecodeNodeIndex(), NPL::EmplaceLeaf(), platform::HDirectory::GetNodeCategory(), NPL::SXML::InsertAttributeNode(), YSLib::IsPrefixedIndex(), YReader::ShlReader::LoadBookmarks(), YReader::ShlReader::LoadGlobalConfiguration(), YSLib::Drawing::FontCache::LookupFamily(), NPL::SXML::MakeAttributeLiteral(), NPL::SXML::MakeTop(), NPL::SXML::MakeXMLDecl(), NPL::SXML::MakeXMLDoc(), NPL::SXML::NodeLiteralToTerm(), YSLib::PackNodes(), ParseLeafWithSourceInformation(), NPL::SXML::PDefH(), NPL::A1::Forms::RegisterBinary(), RegisterForm(), RegisterHandler(), RegisterStrict(), NPL::A1::Forms::RegisterUnary(), YReader::ShlReader::SaveBookmarks(), YReader::ShlReader::SaveGlobalConfiguration(), SetupTraceDepth(), TransformNode(), YSLib::IO::TraverseTree(), platform::FAT::LFN::ValidateName() , 以及 platform_ex::Windows::RegistryKey::YB_NONNULL().

## ◆ string_view

YB_ATTR_nodiscard YB_PURE term NPL::A1::string_view

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

被这些函数引用 BindParameter(), InitializeTypeNameTableEntry() , 以及 ReduceLeafToken().

## ◆ tm

NPL::A1::tm

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

被这些函数引用 BindParameter(), NPL::A1::Forms::CallResolvedUnary(), NPL::A1::Forms::CallUnary(), NPL::A1::Forms::CallUnaryAs(), PDefH(), NPL::A1::SeparatorTransformer::Process() , 以及 TransformNode().

yforward
#define yforward(_expr)
根据参数类型使用 std::forward 转发对应参数。
Definition: ydef.h:1508
ystdex::sfmt
_tString sfmt(const typename string_traits< _tString >::value_type *fmt,...)
以 C 标准输出格式的输出 basic_string 实例的对象。
Definition: string.hpp:2028
CatchExpr
#define CatchExpr(_ex,...)
指定表达式作为异常处理器。
Definition: YBaseMacro.h:129
NPL::A1::name
const char * name
Definition: NPLA1.h:1876
TryExpr
#define TryExpr(...)
指定表达式在 try 块中求值。
Definition: YBaseMacro.h:120
NPL::A1::args
const char _tParams && args
Definition: NPLA1.h:1877