I am a little confused by this. Memoization does not belong with the type 
but with the action. So in your case the sqrt would have a memoization and 
not the Number. 

On Tuesday, March 28, 2023 at 3:06:39 AM UTC+2 Kevin Chowski wrote:

> If you are willing to include some global state to your package, you could 
> always have memoizing logic occur outside of the Number type. That is - you 
> could still have every Number be passed around by value, but for 
> calculating sqrt you'd check some threadsafe global state and either return 
> a pre-calculated value or calculate+cache it.
>
> The obvious downside is that cleaning up this pre-calculation is tricky. A 
> naive implementation would cause all sqrts to be cached for the rest of the 
> program execution. A more complex one would involve some sort of expiration.
>
> On Monday, March 27, 2023 at 9:15:01 AM UTC-6 Travis Keep wrote:
>
>> I have this package: https://pkg.go.dev/github.com/keep94/sqroot, which 
>> computes square roots to arbitrary precision.  The Number type is a value 
>> type that represents a square root value. Early on it made sense to make 
>> Number be an immutable value type because it represents an immutable value 
>> such as sqrt(5).  
>>
>> However, now I want to add memoization to square root values. I have done 
>> this in a private branch, by adding a WithMemoize() method to Number that 
>> returns a new Number with memoization turned on.  I have made the 
>> memoization multiple goroutine safe so that Number types still appear as 
>> immutable numerical values.  
>>
>> However, I am not sure that memoization works well with Value type 
>> semantics.  For instance, if I have two Numbers, x and y, and I set y = x 
>> and continue to use x, y will see any future memoization done for x because 
>> I implement memoization with pointers behind the scenes.  But, y = x 
>> implies that y gets a snapshot of x and won't see future changes in x.  
>> Moreover, I will never be able to add a method to Number that returns 
>> information about memoization progress because that would break 
>> immutability of the Number value type.
>>
>> To solve this dilemma, I could change the API to be pointer based, by 
>> accepting and returning *Number instead of Number.  Then I could say that 
>> Number does not support assignment directly. The advantage of using *Number 
>> is that if x and y are *Number and I set y = x, it is clear that whatever 
>> happens to x will happen to y because they point to the same instance. 
>> However, that would be a huge breaking change.
>>
>> Any suggestions on what to do?
>>
>

-- 
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.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/0595b118-ce74-43a6-b6fd-e653850d622an%40googlegroups.com.

Reply via email to