【Nim】マクロプログラミング用メモ
ドキュメント :
定数
型の種類一覧
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
その他
ノード情報操作/取得
- sameType : ノードの種類が同じかどうかを取得
- getType : ノードの型を取得
- getTypeInst : ノードの型を取得(インスタンス化されたジェネリクスのジェネリクス引数を含む)
- getTypeImpl : ノードの型を取得(ジェネリクス引数を含む)
- kind : ノードの種類(NimNodeKind)を取得(getType系プロシージャで取得したノードに対して使う)
- typeKind : ノードの型の種類(NimTypeKind)を取得(getType系プロシージャで取得したノードに対して使う)
- getImpl : シンボルの実装を取得
- lineInfoObj : ノードのソースコード行情報を取得
- getAst : マクロ展開結果をASTノード化
- expectKind : ノードの種類をチェックする
- プロシージャノード用
- body : ブロック文を取得
- basename : 単項演算子の対象識別子を取得
- eqIdent : 同一識別子かどうかを取得
- hasArgOfName : 指定の仮引数名が存在するかどうかを取得
- 子ノード関連
- ノードの値を取得
ASTノードを文字列化する
- マクロ内で使う(NimNodeを渡す)
- treeRepr : ツリー表示
- lispRepr : LISP風表示
- astGenRepr : ノード生成コード
- マクロ外で使う(コードブロックを渡す)
- 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 {..} |