Indeed this one is nice too. And quite simple to use compared to several 
other solutions :)

I'm always astonished by the incredible number of code generation solutions 
that Go developers have implemented to emulate strongly-typed generics in 
Go. 

In my own case, I've opted for an all-in-one tool which solved all my needs 
(genericity, free-form macros, conditional compilation, inline HTML 
templating, indentation style, etc) at once, but obviously there are 
already many ways to achieve almost the same result by combining several 
existing tools :)

On Tuesday, March 26, 2019 at 10:44:19 AM UTC+1, Michał Matczuk wrote:
>
> You may be also interested in https://github.com/mmatczuk/go_generics (the 
> credit goes to Google).
>
> With it you can write a generic code that actually compiles and change the 
> types later ex. 
> https://github.com/scylladb/go-set/tree/master/internal/set
>
> W dniu poniedziałek, 25 marca 2019 15:58:03 UTC+1 użytkownik David Skinner 
> napisał:
>>
>> I am very, very, old school, grew up with ASM and Macro Assembly. I 
>> really appreciate this.
>>
>> I prefer to write Go code in a purely idiomatic way but there are times i 
>> just want to finish the job and ship it.
>>
>> Thank you for sharing.
>>
>> On Sunday, March 24, 2019 at 4:23:52 PM UTC-5, Ecstatic Coder wrote:
>>>
>>> Just to inform you that I've just released an first version of *Generis*, 
>>> a lightweight code preprocessor adding the following features to the Go 
>>> language :
>>>
>>>    - Generic code definition and instantiation.
>>>    - Conditional compilation.
>>>    - ERB-like HTML templating.
>>>    - Allman to K&R style conversion.
>>>
>>> https://github.com/senselogic/GENERIS
>>>
>>> It's very similar in function to both Ego and Genny, but implemented as 
>>> a free-form C++-like preprocessor.
>>>
>>> Probably of no use at all for anyone who likes to develop Go code in a 
>>> purely idiomatic way, which obviously I'm not...
>>>
>>>
>>> *Sample*
>>>
>>> package main;
>>> // -- IMPORTS
>>> import (
>>>     "html"
>>>     "io"
>>>     "log"
>>>     "net/http"
>>>     "strconv"
>>>     );
>>> // -- DEFINITIONS
>>>
>>> #define DebugMode
>>> #as true
>>> // ~~
>>>
>>> #define HttpPort
>>> #as 8080
>>> // ~~
>>>
>>> #define WriteLine( {{text}} )
>>> #as log.Println( {{text}} )
>>> // ~~
>>>
>>> #define local {{variable}} : {{type}};
>>> #as var {{variable}} {{type}};
>>> // ~~
>>>
>>> #define DeclareStack( {{type}}, {{name}} )
>>> #as
>>>     // -- TYPES
>>>
>>>     type {{name}}Stack struct
>>>     {
>>>         ElementArray []{{type}};
>>>     }
>>>
>>>     // -- INQUIRIES
>>>
>>>     func ( stack * {{name}}Stack ) IsEmpty(
>>>         ) bool
>>>     {
>>>         return len( stack.ElementArray ) == 0;
>>>     }
>>>
>>>     // -- OPERATIONS
>>>
>>>     func ( stack * {{name}}Stack ) Push(
>>>         element {{type}}
>>>         )
>>>     {
>>>         stack.ElementArray = append( stack.ElementArray, element );
>>>     }
>>>
>>>     // ~~
>>>
>>>     func ( stack * {{name}}Stack ) Pop(
>>>         ) {{type}}
>>>     {
>>>         local
>>>             element : {{type}};
>>>
>>>         element = stack.ElementArray[ len( stack.ElementArray ) - 1 ];
>>>
>>>         stack.ElementArray = stack.ElementArray[ : len( stack.ElementArray 
>>> ) - 1 ];
>>>
>>>         return element;
>>>     }
>>> #end
>>> // ~~
>>>
>>> #define DeclareStack( {{type}} )
>>> #as DeclareStack( {{type}}, {{type:PascalCase}} )
>>> // -- TYPES
>>> DeclareStack( string )DeclareStack( int32 )
>>> // -- FUNCTIONS
>>> func HandleRootPage(
>>>     response_writer http.ResponseWriter,
>>>     request * http.Request
>>>     )
>>> {
>>>     local
>>>         boolean : bool;
>>>     local
>>>         natural : uint;
>>>     local
>>>         integer : int;
>>>     local
>>>         real : float64;
>>>     local
>>>         escaped_text,
>>>         text : string;
>>>     local
>>>         integer_stack : Int32Stack;
>>>
>>>     boolean = true;
>>>     natural = 10;
>>>     integer = 20;
>>>     real = 30.0;
>>>     text = "text";
>>>     escaped_text = "<escaped text/>";
>>>
>>>     integer_stack.Push( 10 );
>>>     integer_stack.Push( 20 );
>>>     integer_stack.Push( 30 );
>>>
>>>     #write response_writer
>>>         <!DOCTYPE html>
>>>         <html lang="en">
>>>             <head>
>>>                 <meta charset="utf-8">
>>>                 <title><%= request.URL.Path %></title>
>>>             </head>
>>>             <body>
>>>                 <% if ( boolean ) { %>
>>>                     <%= "URL : " + request.URL.Path %>
>>>                     <br/>
>>>                     <%@ natural %>
>>>                     <%# integer %>
>>>                     <%& real %>
>>>                     <br/>
>>>                     <%~ text %>
>>>                     <%= escaped_text %>
>>>                     <%= "<%% ignored %%>" %>
>>>                     <%% ignored %%>
>>>                 <% } %>
>>>                 <br/>
>>>                 Stack :
>>>                 <br/>
>>>                 <% for !integer_stack.IsEmpty() { %>
>>>                     <%# integer_stack.Pop() %>
>>>                 <% } %>
>>>             </body>
>>>         </html>
>>>     #end
>>> }
>>> // ~~
>>> func main()
>>> {
>>>     http.HandleFunc( "/", HandleRootPage );
>>>
>>>     #if DebugMode
>>>         WriteLine( "Listening on http://localhost:HttpPort"; );
>>>     #end
>>>
>>>     log.Fatal(
>>>         http.ListenAndServe( ":8080", nil )
>>>         );
>>> }
>>>
>>>

-- 
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 golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to