Hi!

Just an update to tell i cleaned up the code and added a cli to ease usage 
and demo it!

Since last post i added parameters to type mutators, for example you write

type Todos implements<:Mutexed (Slice .Todo "Name")>




The Slice Type will handle the extra params to generate a FindByName method.

// range over args to produce new FindBy methods
<:range $a := .Args> func (m <:$.Name>Slice) FindBy<:$a>(<:$a> <:$.ArgType $a>) 
(<:$.Name>,bool) {
  for i, items := range s.items {
    if item.<:$a> == <:$a> {
      return item, true
    }
  }
  return <:$.Name>{}, false
}


I also updated error reporting,

For a decl like this,

package tomate

type tomate struct qsdqd{} // bad


It outputs

unexpected token
In file=<noname> At=3:19
Found=wordToken wanted=[bracketOpenToken]

...
5  package tomate
6  type tomate struct qsdqd{}
   ---------------------↑
...


BTW, if template.Template could report position of the error within the 
line it would be better ;)
See an error reported from a template execution
0  
1  type Todos implements<:Mutexed (Slice, .Todo "Name"):> {
✘- ↑↑↑ ???
2    // it reads as a mutexed list of todo.
3  }
...

panic: in gigo template: gigo:3: unexpected "," in operand at line 3:-1 [
recovered]
    panic: in gigo template: gigo:3: unexpected "," in operand at line 3:-1


And finally the cli was added so you can gen/dump/str an input file,
check the readme 
https://github.com/mh-cbon/gigo#-go-run-maingo--symbol-push-gen-demogigogo

~~Happy coding!





On Wednesday, March 29, 2017 at 10:29:56 PM UTC+2, [email protected] wrote:
>
> Hi !
>
> I m very happy to share with you gigo
>
> Its a go generate on steroids, Its more close to something like babel than 
> go generate, see,
>
> in input it takes
>
>
> type Todo struct {
>   Name string
>   Done bool
> }
>
> type Todos implements<Mutexed (Slice .Todo)> {
>   // it reads as a mutexed list of todo.
> }
>
> func (t *Todos) Hello(){fmt.Println("Hello")}
>
>
> template Mutexed<.Name> struct {
>   lock *sync.Mutex
>   embed <.Name>
> }
>
> <range $m := .Methods> func (m Mutexed<$.Name>) <$m.Name>(<$m.Params>) <$m
> .Out> {
>   lock.Lock()
>   defer lock.Unlock()
>   m.embed.<$m.GetName>(<$m.Args>)
> }
>
> template <.Name>Slice struct {
>   items []<.Name>
> }
>
> func (s <.Name>Slice) Push(item <.Name>) int {
>   s.items = append(s.items, item)
>   return len(s.items)
> }
>
> func (s <.Name>Slice) Index(item <.Name>) int {
>   for i, items := range s.items {
>     if item == search {
>       return i
>     }
>   }
>   return -1
> }
>
> func (s <.Name>Slice) RemoveAt(i index) int {
>     s.items = append(s.items[:i], s.items[i+1:]...)
> }
>
> func (s <.Name>Slice) Remove(item <.Name>) int {
>   if i:= s.Index(item); i > -1 {
>     s.RemoveAt(i)
>     return i
>   }
>   return -1
> }
>
>
>
> It produces
>
>
>
>
> type Todo struct {
>   Name string
>   Done bool
> }
>
>
> type TodoSlice struct {
>   items []Todo
> }
>
>
> func (s TodoSlice) Push(item Todo) int {
>   s.items = append(s.items, item)
>   return len(s.items)
> }
>
>
> func (s TodoSlice) Index(item Todo) int {
>   for i, items := range s.items {
>     if item == search {
>       return i
>     }
>   }
>   return -1
> }
>
>
> func (s TodoSlice) RemoveAt(i index) int {
>         s.items = append(s.items[:i], s.items[i+1:]...)
> }
>
>
> func (s TodoSlice) Remove(item Todo) int {
>   if i:= s.Index(item); i > -1 {
>     s.RemoveAt(i)
>     return i
>   }
>   return -1
> }
> // while this is compatible with its local contracts,
> // it will work and still takes advantages of concrete types exported by 
> consumed package.
>
> type MutexedTodoSlice struct {
>   lock *sync.Mutex
>   embed TodoSlice
> }
>
>
>  func (m MutexedTodoSlice)  Push((item Todo))  int {
>   lock.Lock()
>   defer lock.Unlock()
>   m.embed.<$m.GetName>(<$m.Args>)
> }
>  func (m MutexedTodoSlice)  Index((item Todo))  int {
>   lock.Lock()
>   defer lock.Unlock()
>   m.embed.<$m.GetName>(<$m.Args>)
> }
>  func (m MutexedTodoSlice)  RemoveAt((i index))  int {
>   lock.Lock()
>   defer lock.Unlock()
>   m.embed.<$m.GetName>(<$m.Args>)
> }
>  func (m MutexedTodoSlice)  Remove((item Todo))  int {
>   lock.Lock()
>   defer lock.Unlock()
>   m.embed.<$m.GetName>(<$m.Args>)
> }
>
>
> type Todos struct {
>         MutexedTodoSlice
>   // it reads as a mutexed list of todo.
> }
>
> func (t *Todos) Hello(){fmt.Println("Hello")}
>
> Still some work to be done, but you got the idea!
>
>
>
> It implements a whole tokenizer/interpreter  of go code (almost), 
>
> a bit like go/ast, but its way more lighter(so far), 
>
> the idea being to be able add more customization based on that.
>
>
> The package currently tokenize a source code,
>
> interprets it into declarations,
>
> manipulates nodes to use a regular go template.Template
>
> to execute the generation,
>
> finally it builds a go file and output its.
>
>
> It adds new syntaxes such as
>
>
> implements, which produces a struct
>
> type Todos implements<Mutexed (Slice .Todo)> 
>
>
> template, to define virutal structs type
>
> template Mutexed<.Name> struct
>
>
> Then the systems understands instructions blocks 
>
> such as "regular" method declaration to template
> func (s <.Name>Slice) Push(item <.Name>) int {
>   s.items = append(s.items, item)
>   return len(s.items)
> }
>
>
> And pure template expressions,
>
> (although, at that moment, its a limited to methods only)
> <range $m := .Methods> func (m Mutexed<$.Name>) <$m.Name>(<$m.Params>) 
> <$m.Out> {
>   lock.Lock()
>   defer lock.Unlock()
>   m.embed.<$m.GetName>(<$m.Args>)
> }
>
>
> I plan to be able to declare func to inject into template instructions,
>
> so you ll be able to do pretty much anything i think.
>
>
> I m not sure the new syntaxes are correct, 
>
> but i d that this project is the starting point of an effort to 
>
> improve go coding experience.
>
> In that goal, any comments are welcome!
>
>
> Last thing, at that very moment the package is extremly new,
>
> don t expect too much, 
>
> it did work with the demo file 
> https://github.com/mh-cbon/gigo/blob/master/demo.gigo.go ;)
>
>
> ~~ Happy coding !
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to