Let's go through your examples now.
    
    
    type StrangeConcept[T] = concept c
      c is T # Equivalent to "c is any", which is true
      float(c) is T # Equivalent to "float(c) is any", which is true
      $c is T # Equivalent to "$c is any", which is true
    when int is StrangeConcept:
      echo "Yes, it is" # this is printed
    

Nope, it should be:
    
    
    type StrangeConcept = concept c
      c is type(c) # Equivalent to "c is any", which is true
      float(c) is type(c) # Equivalent to "float(c) is any", which is true
      $c is type(c) # Equivalent to "$c is any", which is true
    

No container, hence no `T`. As a workaround you need to write `type(c)`. A 
clean solution IMO.
    
    
    type NewConcept[T] = concept c
      c is seq[T]
      ...
    

Works.
    
    
    type YouCanAddOne[T] = concept c
      c is T
      c+1 is T
    

Doesn't work this way, numbers are not containers. `type(c)` is the workaround.
    
    
    type MixWithFunctions1[T] = concept c
      f[T](c)
      ...
    type MixWithFunctions2[T] = concept c
      f(c, (new T)[])
      ...
    

Maybe this implies the inference rules need to cover `proc (S, ...): T` too? Oh 
well, you can extend them. But I don't think this needs to be supported for 
version 1 of the concepts implementation. 

Reply via email to