From f7b1b8cd665b2d2dc94dc0d82682b3e049572521 Mon Sep 17 00:00:00 2001 From: Joey Payne Date: Sun, 5 Jul 2015 20:51:23 -0600 Subject: [PATCH] Added templates and getAst in place of quote do. Also replace PNimrodNode. --- oop_macro.nim | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/oop_macro.nim b/oop_macro.nim index 1c2c80b..d10c881 100644 --- a/oop_macro.nim +++ b/oop_macro.nim @@ -8,17 +8,20 @@ macro new*(obj: untyped): untyped= ## and calls the init() method on it if obj.kind == nnkObjConstr: # Only if the node is an object constructor - result = quote do: - var init_obj = `obj` + template init_object(obj)= + var init_obj = obj when compiles(init_obj.init()): init_obj.init() init_obj + result = getAst(init_object(obj)) else: # Otherwise, just revert to system.new - result = quote do: - var init_obj = `obj` + template init_object(obj)= + var init_obj = obj system.new(init_obj) + result = getAst(init_object(obj)) + macro class*(head: untyped, body: untyped): untyped= # The macro is immediate so that it doesn't @@ -29,7 +32,7 @@ macro class*(head: untyped, body: untyped): untyped= let obj_reference = "self" var export_class: bool = false # whether or not to export the class to other modules - var typeName, baseName: PNimrodNode + var typeName, baseName: NimNode if head.kind == nnkIdent: # `head` is expression `typeName` @@ -188,7 +191,7 @@ macro class*(head: untyped, body: untyped): untyped= # simply call the class method from here # proc procName= # procName_ClassName() - var p: seq[PNimrodNode] = @[] + var p: seq[NimNode] = @[] for i in 1..n.params.len-1: p.add(n.params[i][0]) if is_assignment: @@ -228,21 +231,23 @@ macro class*(head: untyped, body: untyped): untyped= # Ident !"int" # Empty - var type_decl: PNimrodNode + var type_decl: NimNode + + template declare_type_export(tname, bname)= + type tname* = ref object of bname + template declare_type(tname, bname)= + type tname = ref object of bname + if baseName == nil: if export_class: - type_decl = quote do: - type `typeName`* = ref object of RootObj + type_decl = getAst(declare_type_export(typeName, RootObj)) else: - type_decl = quote do: - type `typeName` = ref object of RootObj + type_decl = getAst(declare_type(typeName, RootObj)) else: if export_class: - type_decl = quote do: - type `typeName`* = ref object of `baseName` + type_decl = getAst(declare_type_export(typeName, baseName)) else: - type_decl = quote do: - type `typeName` = ref object of `baseName` + type_decl = getAst(declare_type(typeName, baseName)) # Inspect the tree structure: #