I think mine is the same as his: he suggested implementing a function fn like 
this:

function fn(a::AbstractArray{Int,1})
    a = readonly(a)
    ...
end

which does that wrapping inside the function itself. I was just pointing out 
that you need only one new type to wrap any AbstractArray, not one new wrapper 
per AbstractArray type.

Naturally, in that proposal "a = readonly(a)" destroys type stability, but the 
standard Julian solution

function fn(a::ReadOnlyArray{Int,1})
    # implement the real fn
end
fn(a::AbstractArray) = fn(readonly(a))

solves this, while also having the advantage of advertising the existence of a 
direct read-only implementation.

--Tim


On Thursday, August 14, 2014 03:31:58 AM Tobias Knopp wrote:
> I second that I knew a lot more people doing scientific computing with
> Matlab/Python.
> And of those few that use C++ only a minority knows (and cares) how to
> write const aware code...
> 
> To your solution, Tim: I think Steve wants to hide this in the function so
> that regular arrays can be passed. In your version a Wrapper type has to be
> created before calling the function.
> 
> Cheers,
> 
> Tobi
> 
> Am Donnerstag, 14. August 2014 11:54:15 UTC+2 schrieb Tim Holy:
> > For any algorithm that accepts AbstractArrays, can't you just just define
> > 
> > immutable ReadOnlyArray{T,N,AT<:AbstractArray} <: AbstractArray{T,N}
> > 
> >     data::AT
> > 
> > end
> > ReadOnlyArray{AT<:AbstractArray}(A::AT) =
> > ReadOnlyArray{eltype(A),ndims(A),typeof(A)}(A)
> > 
> > and then define the pass-through methods you want to support? That way can
> > wrap
> > any array type.
> > 
> > 
> > Also, you could easily create your own package that does this. I don't see
> > any
> > particular requirement to have it in base.
> > 
> > 
> > One nit: can you really support your assertion that C++ and Fortran are
> > the
> > two major languages of scientific computing? In my world, Matlab is used
> > by
> > about 20x (maybe 50x) as many people as C++. I suspect there's a major
> > divide
> > depending on field. Science is a big place.
> > 
> > --Tim
> > 
> > On Wednesday, August 13, 2014 03:19:36 PM [email protected]
> > 
> > <javascript:> wrote:
> > > Dear Julia colleagues,
> > > 
> > > In June, I wondered on this newsgroup why Julia lacks an 'inarg'
> > > specification for functions.  The two major languages used nowadays for
> > > scientific programming, namely Fortran and C++, both provide mechanisms
> > 
> > to
> > 
> > > declare that a function argument is read-only by the function.  Indeed,
> > > this was added to Fortran late in its life, so one assumes that there is
> > > some bitter experience underlying the decision to include it in Fortran.
> > > 
> > >  (Matlab has only inargs, at least until you get to relatively advanced
> > > 
> > > programming techniques, so this is not an issue.)
> > > 
> > > Stefan Karpinski provided a convincing explanation for why inarg and
> > 
> > outarg
> > 
> > > specifications have been omitted from the Julia core.  Now that I am
> > > slightly more familiar with Julia, I would like to make a proposal for
> > > inarg that would not require changes to the core language.  The proposal
> > > would, however, entail substantial additional code, so it is intended
> > 
> > for
> > 
> > > some version of Julia in the future.
> > > 
> > > Here is the proposal: suppose fn is a function that takes an array input
> > > "a" and wants to declare it to be read-only.  Then at the beginning of
> > 
> > the
> > 
> > > function before any of the arguments gets used, there would be an
> > > assignment statement like this:
> > > 
> > > function fn(a::AbstractArray{Int,1})
> > > a = readonly(a)
> > > 
> > > The way this would work is as follows: Julia would have new types,
> > 
> > mostly
> > 
> > > invisible to the user, like ReadOnlyArray which would have a setindex!
> > > method that would throw an error, Then there would be methods like
> > > readonly{T.N}(a::Array{T,N}) that would use 'reinterpret' to change the
> > > Array to a ReadOnlyArray.  A programmer who wanted to write a function
> > 
> > that
> > 
> > > could take either arrays or readonlyarrays as inputs would have to
> > 
> > declare
> > 
> > > abstract argument types like DenseArray or AbstractArray.  The user
> > 
> > would
> > 
> > > not, in general, have to worry about the read-only types; the situation
> > > when a user would have to worry about them is if he/she wants to develop
> > 
> > a
> > 
> > > read-only version of his/her own data structure that internally uses the
> > > standard containers.
> > > 
> > > This proposal has several advantages:
> > > 
> > > (1) The above mechanism enforces the read-only property of a since fn no
> > > longer has access to the initial (writeable) definition of a.
> > > 
> > > (2) The above mechanism, if adopted as an idiom, could be easily spotted
> > 
> > by
> > 
> > > program analysis tools that could then make optimizations based on the
> > 
> > fact
> > 
> > > that a is read-only.
> > > 
> > > (3) There is hardly any performance penalty for this mechanism.
> > > 
> > > But obviously there is one big disadvantage:
> > > 
> > > (1) For each of the standard containers, a new read-only version would
> > 
> > have
> > 
> > > to be written.  Furthermore, there would also have to be an abstract
> > 
> > type
> > 
> > > to serve as a common parent.  E.g. there is currently no abstract parent
> > > for Set (although there is an open discussion about that matter on
> > 
> > github).
> > 
> > > and a second minor disadvantage
> > > 
> > > (2) The enforcement of read-only would probably would not work
> > 
> > recursively,
> > 
> > > e.g., if a were an array of arrays.  In fact C++ has a similar gap in
> > 
> > its
> > 
> > > 'const' mechanism.
> > > 
> > > -- Steve Vavasis

Reply via email to