>
> I sorta only vaguely understand what you mean about being 'too big'.


I’m being vague and I haven’t read this thread in detail besides seeing 
type B in the first email. I plan to read it in detail and send another 
response. I’m speaking from the idea behind a version of this story: 
http://cs.txstate.edu/~br02/cs1428/ShortStoryForEngineers.htm

Matt

On Friday, May 4, 2018 at 5:28:30 PM UTC-5, Louki Sumirniy wrote:
>
> I sorta only vaguely understand what you mean about being 'too big'. I 
> only have 4 comparators, 5 walk operators and a small collection maybe 
> around 8 helper functions. But now that I'm working with inter-convertible 
> slice types, I don't have to do any interfaces in fact. I only have 5 types 
> I actually need to use now, byte, uint8, 16, 32 and 64. I can use switch 
> blocks to implement each one depending on the data being worked on. There 
> won't be any package scoping issues either nor any closure scoping issues 
> as I won't need to do this, the configurations in the main struct will be 
> used as conditions in the switches.
>
> Scoping and side effects from it were causing me huge headaches up to now. 
> Data was not being read or written to the right locations and I couldn't 
> figure out why, something to do with interfaces and package scoping I 
> think. None of this will be a problem as I kinda don't even need to use 
> type interfaces at all, I will try to avoid this. It's a very low level 
> code I will be writing, something that will evoke halcyon days of assembly 
> programming, but with GC, type safety and neat infix operators.
>
> On Saturday, 5 May 2018 00:26:11 UTC+3, matthe...@gmail.com wrote:
>>
>> With byte slices you’ll need to pay attention to reallocation of the 
>> backing array as a possible source of performance problems (
>> https://blog.golang.org/go-slices-usage-and-internals).
>>
>> I can see clearly how freakin complex code gets when you try to do 
>>> generics and polymorphism.
>>
>>
>> I think it’s only complex because you’re not using the best possible 
>> idioms. For example I mentioned in the other thread that I think your 
>> interface is too big. Have you thought of other ways to do the typing?
>>
>> Perhaps try another language like Rust?
>>
>>
>> I think Go could work.
>>
>> Matt
>>
>> On Friday, May 4, 2018 at 1:45:52 PM UTC-5, atomly wrote:
>>>
>>> Perhaps try another language like Rust?
>>>
>>> atomly
>>>
>>> On Fri, May 4, 2018 at 10:44 AM, Louki Sumirniy <
>>> louki.sumir...@gmail.com> wrote:
>>>
>>>> Well after bashing my head against a brick wall I finally understand 
>>>> what a mess it is for my specific purpose to work with Go. Nobody really 
>>>> specifically said it in any discussions up to now but what my design needs 
>>>> is generics. If code generation could be done more transparently I could 
>>>> use that but it really kicks interactivity and flow in the nuts. I'm going 
>>>> to probably abandon Golang on this basis. I am inclined to go with C but I 
>>>> am nervous about  issues relating to pointers and runtime breaks but oh 
>>>> well. </discussion for me>. 
>>>>
>>>> If there was a way to transparently add code generation that would be 
>>>> sufficient and remain type safe. *sigh*
>>>>
>>>> The biggest headache I am running up against is that between packages. 
>>>> I think that before I throw in the towel I am going to study exactly how 
>>>> the sort package is implemented, since in essence my library does the same 
>>>> thing, so maybe I just don't understand well enough how to use interfaces, 
>>>> embedding and composition.
>>>>
>>>>
>>>> On Friday, 4 May 2018 13:13:56 UTC+3, Louki Sumirniy wrote:
>>>>>
>>>>> Yep, you are correct, more or less. My code is using interfaces and 
>>>>> panicking when it's fed the wrong thing.
>>>>>
>>>>> For example, in my test I had a literal number going into a write 
>>>>> function to put a value into a node in the tree. The insert 
>>>>> implementation 
>>>>> panicked saying it couldn't put an int into a uint32 slot. Eventually I 
>>>>> worked out it was the assumed int typing of the literal causing the 
>>>>> problem 
>>>>> (happens all the time, I should be used to it by now).
>>>>>
>>>>> The thing is, it is intended that the user of the type specific 
>>>>> library that imports the tree library will not make a type assumption 
>>>>> like 
>>>>> the compiler did about a literal. The type specific part has to be 
>>>>> written 
>>>>> for any given type. There is a little verbosity in the part that wraps 
>>>>> the 
>>>>> injected functions with syntactic sugar so the base library has the 
>>>>> functions to work on the concrete data agnostic of its content and only 
>>>>> the 
>>>>> return values provided by the functions it gets to do various comparisons 
>>>>> and whatnot. It's not excessively wordy for my tastes and I know it's 
>>>>> doing 
>>>>> it the best way possible.
>>>>>
>>>>> It's just learning how to play with interfaces that I was struggling 
>>>>> with and I seem to have pretty much got it all figured out now.  I'm 
>>>>> happy 
>>>>> with how the code is developing and pretty much joyous that I can do this 
>>>>> inside a type safe language. Type safety is a big part of how Go is such 
>>>>> a 
>>>>> fast compiling language. Implicit casts and inheritance have a massive 
>>>>> cost 
>>>>> in complexity not just a naive translation to binary code, but also in 
>>>>> optimising it. When can it cut out the dereferencing to methods and when 
>>>>> not? Since one could be using a method to do a relatively simple thing, 
>>>>> in 
>>>>> very long, tight loops, if the OOP compiler guesses wrong and puts 
>>>>> dereferences in where they are not needed, it's a big cost over 1 million 
>>>>> iterations compared to being aware of it, like in my code, and avoiding 
>>>>> the 
>>>>> need for dereferencing.
>>>>>
>>>>> I firmly believe that Go could replace C as a language to write 
>>>>> systems kernels in. I saw an amusing post recently relating to Dan 
>>>>> Larimer's work on EOS mentioning an automated code correctness checking 
>>>>> application for C++... Having intimately dealt with Dan's C++ source 
>>>>> code, 
>>>>> I can see why he might be waking up to this, especially with the ether 
>>>>> leaks going on, that EOS has inherited (literally, I presume).
>>>>>
>>>>> This would not happen if it were written in Go. Note also that Geth 
>>>>> lacks this problem and there was almost going to be a split over code 
>>>>> changes from the Go side.
>>>>>
>>>>> Linus Torvalds famously said he wrote the Git CVS in C specifically to 
>>>>> exclude C++ programmers. But as any avid gopher would know, C has all 
>>>>> kinds 
>>>>> of gotchas to do with busting out of stacks, heaps, allocated memory, and 
>>>>> forgetting to free memory. This does not happen in Go. 
>>>>>
>>>>> So to cut a long story short, this is why I choose to program in Go. I 
>>>>> have a background in low level programming, I used to do a bit of M68k 
>>>>> assembler on my amiga when I was a teenager. I don't mind verbosity that 
>>>>> is 
>>>>> necessary due to hardware architectural constraints. And as to the 
>>>>> potential users of my code, I am not responsible for them having a lack 
>>>>> of 
>>>>> awareness of the exposed inner workings and them scratching their head at 
>>>>> panics when they try to push the wrong type of value into one of the 
>>>>> functions I wrote. They probably need to do some more study.
>>>>>
>>>>> I think of programming a bit like carpentry. Sure, you can just whack 
>>>>> together an Ikea table in half an hour, but if you want to make a nice 
>>>>> one 
>>>>> that will last hundreds of years, you probably will need to at least 
>>>>> spend 
>>>>> a week or two practicing before you even have something simply crude and 
>>>>> functional. C++ and other OOP and interpreted language users are like 
>>>>> Ikea 
>>>>> customers. Gophers are like people who go to the sawmill and the 
>>>>> specialist 
>>>>> tool store. Disregarding the zero cost of reproduction of course (that's 
>>>>> what Ikea does).
>>>>>
>>>>> On Friday, 4 May 2018 11:36:33 UTC+3, M P r a d e s wrote:
>>>>>>
>>>>>> > Eliminating code duplication shrinks the base of code that must be 
>>>>>> changed
>>>>>>
>>>>>> Except go was designed a certain way that will make whatever you are 
>>>>>> attempting to do here burdensome. We've all been there at first trying 
>>>>>> to 
>>>>>> fit a square into a round hole, it doesn't work. Unless you start 
>>>>>> ignoring 
>>>>>> Go type system with interface {} everywhere, you're not going to go far 
>>>>>> trying to emulate method overloading in Go. The price of using Go is 
>>>>>> absolutely code duplication and a certain amount of verbosity in order 
>>>>>> to 
>>>>>> remain type safe. The only real way to achieve method polymorphism in go 
>>>>>> is 
>>>>>> to use interfaces, since Go supports neither inheritance nor generic 
>>>>>> programming. Go does not allow developers to write "clever" code without 
>>>>>> sacrificing readability or compile time type safety. 
>>>>>>
>>>>>> Le vendredi 4 mai 2018 06:26:59 UTC+2, Louki Sumirniy a écrit :
>>>>>>>
>>>>>>> The specifics of how it is done is not as important as why to do it:
>>>>>>>
>>>>>>> I am writing this for a later project. It will need at least 5 
>>>>>>> different, sometimes nearly not very different, short data types. They 
>>>>>>> all 
>>>>>>> have the property of being comparable. The code that keeps them stored 
>>>>>>> and 
>>>>>>> sorted does not need to know anything other than this comparability, 
>>>>>>> and to 
>>>>>>> be able to pass the data back to the caller.
>>>>>>>
>>>>>>> I am not making claims about something, trying to sell some snake 
>>>>>>> oil, I am attempting to solve a problem and make use of low level 
>>>>>>> architecture of the hardware to improve performance. It worked for 
>>>>>>> B-heaps 
>>>>>>> so maybe MAYBE it will also benefit binary trees. The way some people 
>>>>>>> respond you'd think I was running an ICO!
>>>>>>>
>>>>>>> Programming is usually 5% writing and 95% debugging. Eliminating 
>>>>>>> code duplication shrinks the base of code that must be changed, 
>>>>>>> otherwise I 
>>>>>>> have to delve into code generators or macros. If I have an intended use 
>>>>>>> for 
>>>>>>> a library I am writing, that would require 5 different source files for 
>>>>>>> each data type, yet 90% of the code was the same, what happens when I 
>>>>>>> realise I made a mistake in this common code?
>>>>>>>
>>>>>>> I pretty much concluded that it is better to just pass an 8 element 
>>>>>>> function pointer struct as value anyway. Whether the compiler does it 
>>>>>>> differently doesn't really matter since I can't control that. What 
>>>>>>> matters 
>>>>>>> to me is that it's readable so I don't have to spend more time reading 
>>>>>>> than 
>>>>>>> understanding.
>>>>>>>
>>>>>>> On Thursday, 3 May 2018 23:40:07 UTC+3, Jan Mercl wrote:
>>>>>>>>
>>>>>>>> On Thu, May 3, 2018 at 10:14 PM Louki Sumirniy <
>>>>>>>> louki.sumir...@gmail.com> wrote:
>>>>>>>>
>>>>>>>> > As some here may know, I am implementing a novel binary tree 
>>>>>>>> based on complete trees and using ideas from B-heaps in order to 
>>>>>>>> achieve 
>>>>>>>> maximum data cache locality in a search and sort algorithm.
>>>>>>>>
>>>>>>>> ...
>>>>>>>>
>>>>>>>> > Note that this is not really at all an OOP paradigm that I am 
>>>>>>>> trying to ape with this.
>>>>>>>>
>>>>>>>> ...
>>>>>>>>
>>>>>>>> > I have the base type that concerns itself with the walk, search, 
>>>>>>>> insert and delete functions in an interface.
>>>>>>>>
>>>>>>>> ....
>>>>>>>>
>>>>>>>> > The b.Overloads - I am not sure, whether it should be pass by 
>>>>>>>> value or pass by reference. I think pass by reference adds an extra 
>>>>>>>> resolution step, but it is probably more expensive as every call of 
>>>>>>>> the 
>>>>>>>> functions will have to perform this dereference.
>>>>>>>>
>>>>>>>> ...
>>>>>>>>
>>>>>>>> > Thanks in advance for any feedback on this.
>>>>>>>>
>>>>>>>> - Novelty is only valid when established by peer review. 
>>>>>>>> Self-claimed novelty often means just lack of research. Even if 
>>>>>>>> eventually 
>>>>>>>> correct, it's a warning sign for me meanwhile.
>>>>>>>>
>>>>>>>> - Attempts to make non-interface types in Go behave in the 
>>>>>>>> OOP-style inheritance is usually a telling sign of using the wrong 
>>>>>>>> language 
>>>>>>>> - or abusing one - to solve the problem.
>>>>>>>>
>>>>>>>> - Pass by reference has not even a well defined meaning in Go.
>>>>>>>>
>>>>>>>> No insult intended, you've explicitly asked for _any_ feedback. My 
>>>>>>>> apologies if you feel offended anyway,
>>>>>>>>
>>>>>>>>
>>>>>>>> -- 
>>>>>>>>
>>>>>>>> -j
>>>>>>>>
>>>>>>> -- 
>>>> 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...@googlegroups.com.
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>>
>>>

-- 
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