It is behaving very well and is far smarter than what I was thinking of: 
this is really impressive!

The only drawback I see is that for now, units are 100 times slower than 
raw calculations on floats and 15 times slower than calculations on a 
Array{5000}. I really hope this will improve over time!

Le vendredi 30 mai 2014 13:13:22 UTC+2, [email protected] a écrit :
>
> Both, I reposted something clearer. I was not aware of these efforts, I'm 
> gonna look at that. Thanks.
>
> Le vendredi 30 mai 2014 12:57:26 UTC+2, Tim Holy a écrit :
>>
>> I'm not sure if you're interested in this as an example of inheritance, 
>> or if 
>> you're interested in this specific application. If the latter, are you 
>> aware of 
>> existing efforts in this arena? You may want to check out SIUnits.jl. 
>>
>> --Tim 
>>
>> On Friday, May 30, 2014 03:37:47 AM [email protected] wrote: 
>> > Hi everyone. 
>> > 
>> > I was thinking for some time about dimensionful arrays or variables in 
>> > general. (I really *really* *really* don't know whether the idea is 
>> sane. 
>> > Actually it tends to create more problem than it solves for what I've 
>> > tried.) 
>> > Dimensionful variables would be a variable which refer to data and a 
>> > physical unit. This can easily be implemented either as: 
>> > 
>> > type DimensionfulArray{T<:Number} 
>> >     data::AbstractArray{T} 
>> >     unit::String 
>> > end 
>> > 
>> > There are, however, many problems raised by this approach. For 
>> instance: 
>> > 
>> >    1. DimensionfulArray does not inherit from AbstractArray so that 
>> every 
>> >    functions should be redefined as Foo(x::DimensionfulArray) = 
>> Foo(x.data). 
>> > 2. The approach used in point 1. has the huge default to involve a lot 
>> of 
>> > boilerplate/repeated code and a new definition has to be written each 
>> time 
>> > a new function is used on DimensionfulArray. 
>> >    3. Most of the time, one does want type invariance: 
>> >     Foo(x::DimensionfulArray) = Foo(x.data) would return a plain array 
>> > instead of a DimensionfulArray instance (wanted most of the time). 
>> >    4. Even if we are consenting adults there, letting the "unit" 
>> attribute 
>> >    directly accessible is not a really good practice. 
>> >    5. With this approach a lot of "If"s will be put everywhere to check 
>> >    what the "unit" attribute is. 
>> > 
>> > 
>> http://grollchristian.wordpress.com/2014/01/22/julia-inheriting-behavior/ 
>> > had the exact same problem and I'm not sure his solution is the most 
>> > maintainable one. 
>> > https://groups.google.com/forum/#!topic/julia-users/jlJrMTo_L1M was 
>> about 
>> > subtyping concrete types but Stefan redirected to 
>> > 
>> https://groups.google.com/forum/#!msg/julia-dev/p9bV6rMSmvY/cExeSb-cMBYJ 
>> > which is about inheritance in general and delegation in particular. 
>> > 
>> > In https://groups.google.com/forum/#!topic/julia-users/Wwn3KHmmm9I, 
>> John 
>> > crafted a first implementation of what would become the @delegate macro 
>> > which is now in a RFC process in 
>> > https://github.com/JuliaLang/julia/pull/3292. 
>> > 
>> > The 
>> > comment 
>> https://github.com/JuliaLang/julia/pull/3292#issuecomment-34450100 
>> > in particular was of a great interest for me as it would allow almost 
>> > painless delegation: the default is to delegate except if methods are 
>> > explicitly declared with DimensionfulArray as an input type. 
>> > 
>> > I would really like to be able to write: 
>> > 
>> > type DimensionfulAndRankfulArray{T<:Number} 
>> >     @delegate data::AbstractArray{T} 
>> >     @delegate rank::Int for <, >, ==, !=, <=, >= 
>> >     unit::String 
>> > end 
>> > 
>> > But as stated 
>> > in https://github.com/JuliaLang/julia/pull/3292#issuecomment-34551204, 
>> a 
>> > macro is limited in what it can do. To me, but I have not your skills 
>> and 
>> > your experience, there are at least 3 ways to solve the problem: 
>> > 
>> >    - Either let it as it is now. The down side is that any method 
>> >    declaration occurring after the type declaration and acting on 
>> >    AbstractArray won't be taken into account even though the developer 
>> wrote 
>> > that he was delegating by default to the data field. This makes the 
>> code 
>> > harder to grasp, raises strange errors and forbid any code sharing : 
>> from 
>> > the type declaration point, methods will have either to be defined for 
>> > AbstractArray OR DimensionfulAndRankfulArray, but not both of them at 
>> once. 
>> > - Either include delegate in the language and perform delegation at 
>> > runtime, not at type declaration time which can be heavy and complex. - 
>> Or 
>> > tell the compiler at type declaration time that you are sure that any 
>> > function accepting type AbstractArray is gonna work with your 
>> RankfulArray 
>> > because you delegated (trait-like approach with delegation :) ): 
>> > 
>> > 
>> > type RankfulArray{T<:Number} <: AbstractArray 
>> >     delegate data::AbstractArray{T} 
>> >     delegate rank::Int for <, >, ==, !=, <=, >= 
>> > end 
>> > 
>> > This could be further simplified as: 
>> > 
>> > type RankfulArray{T<:Number} 
>> >     delegate data::AbstractArray{T} 
>> >     rank::Int 
>> > end 
>> > if there is one and only one delegation in the type definition. 
>> > 
>> > This would look a lot like concrete type inheritance though with all 
>> the 
>> > drawbacks that I don't know yet. 
>> > 
>> > As a last word, being able to preserve types in some functions would be 
>> > great, something like: 
>> > 
>> > type in_eV{T<:Number} 
>> >     delegate data::AbstractArray{T} keep +, - 
>> > end 
>> > which would mean that in_eV([1,2,3]);^2 would return Array([1,4,9]) 
>> > but in_eV([1,2,3]) + 2 would return in_eV([3,4,5]). 
>> > 
>> > type in_eV{T<:Number} 
>> >     delegate data::AbstractArray{T} keep 
>> > end 
>> > would keep the type for everything. 
>> > 
>> > 
>> > I'm really not sure that this does make sense at all. 
>>
>

Reply via email to