Ford: I suspect your time going forward would be better spent attempting to learn the "whys" of Julia's design rather than re-design it yourself. Julia is the most thoughtful, concise, and smartly designed language that I've ever used, and I've used a lot. You will learn a lot just by understanding the language design as it currently is. If you find sections of documentation that can be improved, please improve them.
On Wednesday, May 25, 2016, Yichao Yu <[email protected]> wrote: > On Wed, May 25, 2016 at 8:42 AM, Ford Ox <[email protected] > <javascript:;>> wrote: > > From julia box > > > > macro m(a, b) > > @show isa(a,Int) isa(b,Symbol) > > end > > > > m(1,last) > >>> > >>> isa(a,Int) => true > >>> > >>> isa(b,Symbol) => true > > This is NOT what you want. > It shows you the type of the AST, which for basic constant happens to > be what the constant value is > > If you have `a = 1; @m(a, last)` you will wee `a` is a symbol. > > In general, macro expansion by definition happens at syntax level and > the macro can't possibly have more information than then parser > itself. Lowering to a macro effectively moves the lowering to julia > code and for this case I don't see what can be gained and you'll add a > **lot** of overhead by calling back and forth between the parser and > julia code. > > > > > > > > > Dne středa 25. května 2016 14:26:30 UTC+2 Yichao Yu napsal(a): > >> > >> > >> On May 25, 2016 8:19 AM, "Ford Ox" <[email protected] <javascript:;>> > wrote: > >> > > >> > Lets change compiler so it replace > >> > array[i] > >> > > >> > with > >> > @getindex(array, i) > >> > > >> > instead of > >> > getindex(array, i) > >> > > >> > What we gain: > >> > > >> > array[end] > >> > > >> > :end can be converted to length(array) in julia itself which is nice! > >> > > >> > collections (dict, set, queue...) > >> > > >> > dequeue = ... # its a linked list > >> > dequeue[first] > >> > dequeue[last] # IMO :last causes less confusion than :end for new > >> > programmers, but it doesn't really matter > >> > dequeue[3] > >> > > >> > > >> > macro getindex(q:Queue, key) > >> > key == :first && return :(peekfirst(q)) # complexity O(1) > >> > key == :last && return :(peeklast(q)) # complexity O(1) > >> > isa(key, Int) && return :(peek(q, key)) # complexity O(n) > >> > end > >> > >> No, the type info is not available at syntax level. > >> > >> > > >> > > >> > let's say that we would also have special syntax for > >> > > >> > popindex() > >> > array[index]-- #completely made up > >> > > >> > and insertindex() > >> > array[index]++ > >> > > >> > Then we could do the similar thing as above > >> > macro popindex(q:Queue, key) > >> > key == :first && return :(shift!(q)) > >> > key == :last && return :(polll!(q)) > >> > isa(key, Int) && return :(deleteat!(q, key)) > >> > end > >> > macro insertindex ..... > >> > > >> > > >> > This looks pretty nice, don't you think? > >> > > >> > We could even some crazy stuff like this: > >> > type Foo > >> > a; b; c; d > >> > end > >> > > >> > macro setindex(f::Foo, key, value) > >> > return :(setfield(f, key, value)) > >> > end > >> > > >> > f = Foo(1, 2, 3, 4) > >> > f[c] = 10 > >> > Seems like we don't need the dot accessing aka foo.var huh? > >> > >
