Flat Leon Works

アプリやゲームを作ってます。

【Nim】マクロプログラミング用メモ

ドキュメント :
macrosモジュール

定数

型の種類一覧

NimTypeKind = enum
  ntyNone, ntyBool, ntyChar, ntyEmpty, ntyAlias, ntyNil, ntyExpr, ntyStmt, ntyTypeDesc,
  ntyGenericInvocation, ntyGenericBody, ntyGenericInst, ntyGenericParam,
  ntyDistinct, ntyEnum, ntyOrdinal, ntyArray, ntyObject, ntyTuple, ntySet, ntyRange,
  ntyPtr, ntyRef, ntyVar, ntySequence, ntyProc, ntyPointer, ntyOpenArray, ntyString,
  ntyCString, ntyForward, ntyInt, ntyInt8, ntyInt16, ntyInt32, ntyInt64, ntyFloat,
  ntyFloat32, ntyFloat64, ntyFloat128, ntyUInt, ntyUInt8, ntyUInt16, ntyUInt32,
  ntyUInt64, ntyUnused0, ntyUnused1, ntyUnused2, ntyVarargs, ntyUnused, ntyError,
  ntyBuiltinTypeClass, ntyUserTypeClass, ntyUserTypeClassInst,
  ntyCompositeTypeClass, ntyInferred, ntyAnd, ntyOr, ntyNot, ntyAnything, ntyStatic,
  ntyFromExpr, ntyFieldAccessor, ntyVoid

シンボルの種類一覧

NimSymKind = enum
  nskUnknown, nskConditional, nskDynLib, nskParam, nskGenericParam, nskTemp,
  nskModule, nskType, nskVar, nskLet, nskConst, nskResult, nskProc, nskMethod,
  nskIterator, nskConverter, nskMacro, nskTemplate, nskField, nskEnumField, nskForVar,
  nskLabel, nskStub

ノードの種類一覧

NimNodeKind = enum
  nnkNone, nnkEmpty, nnkIdent, nnkSym, nnkType, nnkCharLit, nnkIntLit, nnkInt8Lit,
  nnkInt16Lit, nnkInt32Lit, nnkInt64Lit, nnkUIntLit, nnkUInt8Lit, nnkUInt16Lit,
  nnkUInt32Lit, nnkUInt64Lit, nnkFloatLit, nnkFloat32Lit, nnkFloat64Lit,
  nnkFloat128Lit, nnkStrLit, nnkRStrLit, nnkTripleStrLit, nnkNilLit, nnkMetaNode,
  nnkDotCall, nnkCommand, nnkCall, nnkCallStrLit, nnkInfix, nnkPrefix, nnkPostfix,
  nnkHiddenCallConv, nnkExprEqExpr, nnkExprColonExpr, nnkIdentDefs, nnkVarTuple,
  nnkPar, nnkObjConstr, nnkCurly, nnkCurlyExpr, nnkBracket, nnkBracketExpr,
  nnkPragmaExpr, nnkRange, nnkDotExpr, nnkCheckedFieldExpr, nnkDerefExpr, nnkIfExpr,
  nnkElifExpr, nnkElseExpr, nnkLambda, nnkDo, nnkAccQuoted, nnkTableConstr, nnkBind,
  nnkClosedSymChoice, nnkOpenSymChoice, nnkHiddenStdConv, nnkHiddenSubConv, nnkConv,
  nnkCast, nnkStaticExpr, nnkAddr, nnkHiddenAddr, nnkHiddenDeref, nnkObjDownConv,
  nnkObjUpConv, nnkChckRangeF, nnkChckRange64, nnkChckRange, nnkStringToCString,
  nnkCStringToString, nnkAsgn, nnkFastAsgn, nnkGenericParams, nnkFormalParams,
  nnkOfInherit, nnkImportAs, nnkProcDef, nnkMethodDef, nnkConverterDef, nnkMacroDef,
  nnkTemplateDef, nnkIteratorDef, nnkOfBranch, nnkElifBranch, nnkExceptBranch,
  nnkElse, nnkAsmStmt, nnkPragma, nnkPragmaBlock, nnkIfStmt, nnkWhenStmt, nnkForStmt,
  nnkParForStmt, nnkWhileStmt, nnkCaseStmt, nnkTypeSection, nnkVarSection,
  nnkLetSection, nnkConstSection, nnkConstDef, nnkTypeDef, nnkYieldStmt, nnkDefer,
  nnkTryStmt, nnkFinally, nnkRaiseStmt, nnkReturnStmt, nnkBreakStmt, nnkContinueStmt,
  nnkBlockStmt, nnkStaticStmt, nnkDiscardStmt, nnkStmtList, nnkImportStmt,
  nnkImportExceptStmt, nnkExportStmt, nnkExportExceptStmt, nnkFromStmt,
  nnkIncludeStmt, nnkBindStmt, nnkMixinStmt, nnkUsingStmt, nnkCommentStmt,
  nnkStmtListExpr, nnkBlockExpr, nnkStmtListType, nnkBlockType, nnkWith, nnkWithout,
  nnkTypeOfExpr, nnkObjectTy, nnkTupleTy, nnkTupleClassTy, nnkTypeClassTy,
  nnkStaticTy, nnkRecList, nnkRecCase, nnkRecWhen, nnkRefTy, nnkPtrTy, nnkVarTy,
  nnkConstTy, nnkMutableTy, nnkDistinctTy, nnkProcTy, nnkIteratorTy, nnkSharedTy,
  nnkEnumTy, nnkEnumFieldDef, nnkArglist, nnkPattern, nnkReturnToken, nnkClosure,
  nnkGotoState, nnkState, nnkBreakState

その他

ノード情報操作/取得

ASTノードを文字列化する

  • マクロ内で使う(NimNodeを渡す)
  • マクロ外で使う(コードブロックを渡す)
    • dumpTree : ツリー表現を標準出力する
    • dumpLisp : LISP風表現を標準出力する
    • dumpAstGen : ノード生成コード表現を標準出力する

ASTノードを作成する

作成するノード 使用するプロシージャ
任意のノードを作成 proc newNimNode(kind: NimNodeKind; lineInfoFrom: NimNode = nil): NimNode {..}
ノードから文字列リテラルノードを作成 proc toStrLit(n: NimNode): NimNode {..}
コードからノード生成 proc quote(bl: typed; op = "``"): NimNode {..}
文字列からノード生成 proc parseExpr(s: string): NimNode {..}
proc parseStmt(s: string): NimNode {..}
マクロの呼び出し元の式のノードを取得 proc callsite(): NimNode {..}
ノード単体をコピー proc copyNimNode(n: NimNode): NimNode {..}
ノードツリーをコピー proc copyNimTree(n: NimNode): NimNode {..}
proc copy(node: NimNode): NimNode {..}
子ノードをコピー proc copyChildrenTo(src, dest: NimNode) {..}
空ノード proc newEmptyNode(): NimNode {..}
文リスト proc newStmtList(stmts: varargs[NimNode]): NimNode {..}
カッコ式 proc newPar(exprs: varargs[NimNode]): NimNode {..}
ブロック文(ラベル付き) proc newBlockStmt(label, body: NimNode): NimNode {..}
ブロック文 proc newBlockStmt(body: NimNode): NimNode {..}
var定義 proc newVarStmt(name, value: NimNode): NimNode {..}
let定義 proc newLetStmt(name, value: NimNode): NimNode {..}
const定義 proc newConstStmt(name, value: NimNode): NimNode {..}
バインドされたシンボル? proc bindSym(ident: string; rule: BindSymRule = brClosed): NimNode {..}
新規シンボル(genSym) proc genSym(kind: NimSymKind = nskLet; ident = ""): NimNode {..}
代入文 proc newAssignment(lhs, rhs: NimNode): NimNode {..}
ドット式 proc newDotExpr(a, b: NimNode): NimNode {..}
コロン式 proc newColonExpr(a, b: NimNode): NimNode {..}
後置き演算式化 proc postfix(node: NimNode; op: string): NimNode {..}
proc unpackPostfix(node: NimNode): tuple[node: NimNode, op: string] {..} (式を展開)
前置き演算式化 proc prefix(node: NimNode; op: string): NimNode {..}
proc unpackPrefix(node: NimNode): tuple[node: NimNode, op: string] {..} (式を展開)
中置き演算式化 proc infix(a: NimNode; op: string; b: NimNode): NimNode {..}
proc unpackInfix(node: NimNode): tuple[left: NimNode, op: string, right: NimNode] {..} (式を展開)
変数定義 proc newIdentDefs(name, kind: NimNode; default = newEmptyNode()): NimNode {..}
nilリテラル proc newNilLit(): NimNode {..}
プロシージャ定義 proc newProc(name = newEmptyNode(); params: openArray[NimNode] = [newEmptyNode()]; body: NimNode = newStmtList(); procType = nnkProcDef): NimNode {..}
if文 proc newIfStmt(branches: varargs[tuple[cond, body: NimNode]]): NimNode {..}
識別子 proc newIdentNode(i: string): NimNode {..}
proc newIdentNode(i: NimIdent): NimNode {..}
proc ident(name: string): NimNode {..} # 内部でnewIdentNodeを呼んでいるだけ
コメント文 proc newCommentStmtNode(s: string): NimNode {..}
各種リテラル proc newLit(各種リテラル): NimNode {..}
プロシージャ呼び出し proc newCall(theProc: NimNode; args: varargs[NimNode]): NimNode {..}
proc newCall(theProc: NimIdent; args: varargs[NimNode]): NimNode {..}
proc newCall(theProc: string; args: varargs[NimNode]): NimNode {..}
ツリーノード proc newTree(kind: NimNodeKind; children: varargs[NimNode]): NimNode {..}
カッコ式 proc newPar(exprs: varargs[NimNode]): NimNode {..}