import macros
    import typetraits
    import strformat
    
    macro fun*(n: varargs[untyped]): typed =
      result = newNimNode(nnkStmtList, n)
      for x in n:
        result.add(newCall("echo", x))
      
      result.add(newCall("echo", newStrLitNode($(n.len))))
    
    # void-return proc
    proc bar() = echo "ok"
    
    fun(1+1, "abc", 42) # n.len=3
    fun(1+1, "abc") # n.len=2
    fun(1+1) # n.len=1
    fun() # n.len=0
    
    # gives Error: type mismatch: got <void>
    fun(bar())  # n.len=1 ?? why not 0?
    

in D it works correctly and doesn't break generic code: 
    
    
    void fun(T...)(T n){
       static foreach(x:n)
         writeln(x);
      writeln(T.length);
    }
    
    void bar(){writeln("ok");}
    
    fun(1+1, "abc", 42);
    fun(1+1, "abc");
    fun(1+1);
    fun();
    fun(bar());
    

  * is that nim choice by design or could that be fixed so that n.len = 0 in 
above code?
  * how would we work around it in my macro fun to detect whether the type of x 
is void and proceed accordingly?


Reply via email to