Re: [rust-dev] Implementation of traits in Rust: could it be dynamic?

2014-07-22 Thread Nawfel BGH
this remindes me of the issue i got when trying to implement finger
trees in Rust so long ago

https://github.com/rust-lang/rust/issues/8613

I suggested to let add a way to specify (in the code) how match
functions do we want to generate and failing at runtime when the limit
is reached. This made sense in my situation.

2014-07-22 18:23 UTC+01:00, Corey Richardson co...@octayn.net:
 You can avoid monomorphization by using trait objects, which erase
 the precise implementing type through a vtable + pointer.
 http://doc.rust-lang.org/tutorial.html#trait-objects-and-dynamic-method-dispatch
 has some documentation.

 On Tue, Jul 22, 2014 at 10:16 AM, Lionel Parreaux
 lionel.parre...@gmail.com wrote:
 Hi,

 So traits seem to be quite similar to Haskell's classes, being also used
 for
 parametric polymorphism. Now, Haskell classes are usually implemented
 using
 runtime dictionary passing. In general, code cannot be specialized for
 every
 function call, since there may be an unbounded number of instances
 generated
 for it, as is explained in this reddit answer:
 http://www.reddit.com/r/haskell/comments/1ar642/what_type_of_binding_does_haskell_use/c94o2ju

 Knowing that Rust implements traits using monomorphization of code (much
 like C++ templates), I was curious about how it handled such cases, and
 tried this:

 struct WT {
 f: T
 }

 trait Show {
 fn show(self) - int;
 }

 impl Show for int {
 fn show(self) - int { 666 }
 }
 implT:Show Show for WT {
 fn show(self) - int { self.f.show()+1 }
 }
 implT:Clone Clone for WT {
 fn clone(self) - WT { W{f:self.f.clone()} }
 }

 fn fooS:Show+Clone(s: S, n: int) {
 let w = W{f:s.clone()};
 if n  0 { foo(w, n-1); }
 }

 fn main() {
   foo(W{f:42i},42);
 }


 It gave me an error: reached the recursion limit during
 monomorphization,
 which... well, that's a possible solution :)

 I'm not sure whether this is a big problem in practice, but I was
 wondering
 if it would be possible to switch to some runtime mechanism in cases like
 this. Maybe we could make a special version of every generic functions,
 that
 takes a dictionary at runtime and that would be able to handle types
 unknown
 at compile-time. We would switch to this version when monomorphization
 does
 not work. It could also allow dynamic linking of libraries with generic
 functions, or it could be a way to compile some programs (or some parts
 of
 programs) much faster.
 I was thinking about, for example, an IDE where generic function calls to
 types defined inside the files currently being edited use their dynamic
 version, so that recompile times can be virtually inexistent (like Java).
 On
 the other hand, the release build would of course monomorphize as much as
 possible to make the perf optimal.

 Now the question is: would this conform to the current semantic of
 monomorphization? Do special things happen during monomorphization that
 cannot be reproduced at runtime?
 This is the case in C++ (and one of the reasons why C++ templates are so
 bad). Is it the case in Rust, which should already have all the
 required
 info (type bounds) before monomorphization?

 I apologize if this has already been discussed. I could not find many
 satisfying answers by googling.

 Cheers,
 LP.



 ___
 Rust-dev mailing list
 Rust-dev@mozilla.org
 https://mail.mozilla.org/listinfo/rust-dev




 --
 http://octayn.net/
 ___
 Rust-dev mailing list
 Rust-dev@mozilla.org
 https://mail.mozilla.org/listinfo/rust-dev

___
Rust-dev mailing list
Rust-dev@mozilla.org
https://mail.mozilla.org/listinfo/rust-dev


Re: [rust-dev] Syntax sugar: Vec Rc RefCell Box Foo - VecRcRefCellBoxFoo

2014-06-29 Thread Nawfel BGH
I like it.

Lets go all the way down and make `T P` an abbreviation to `TP` and `f x`
an abbreviation to `f(x)`

People will then start to write `f a b` instead of `f(a,b)` since unboxed
closures make this possible. They will also write a macro `defun` to ease
the definitions of such functions and request that feature to be integrated
in the language

Unfortunately `T P1 P2` will not come soon because we don't support type
constructors

Every thing after i like it. was a joke. but i'm really sad to see rust
adopting the current syntax for types



2014-06-28 23:48 GMT+01:00 Benjamin Herr b...@0x539.de:

 So, I've been vaguely concerned that types in a less sigil-heavy Rust
 inevitably devolve into what some call spikey lisp, and tried to come
 up with some more lightweight syntax. Of course, just removing syntax is
 the easiest way to make it weigh less, and it seems like the following
 doesn't actually break the grammar dramatically (only some macros!):

 In parsing a path, if a path segment is immediately followed by an
 identifier, start parsing another type right away and use it as the only
 element of the type parameter list for the current path segment.

 This is fairly limited:

 * It won't work for absolute paths as type parameters
   (since they'll look like just another path segment)
 * It also doesn't work for non-path types in type parameter lists
 * It doesn't simplify multiple type parameters

 I think that's okay, since it's a simplification that applies well to a
 lot of simple cases, and might still reduce the total depth of ``, ``
 nesting in more complicated cases.

 So, for example, the following desugarings would apply:

Vec String
 = VecString

Arc RWLock Vec f64
 = ArcRWLockVecf64

Arc Exclusive Vec Box Buffer T
 = ArcExclusiveVecBoxBufferT // from libsync

RefCell DefIdMap Rc Vec Rc TraitRef
 = RefCellDefIdMapRcVecRcTraitRef// from librustc

HashMapVec String, Vec Rc Cell int
 = HashMapVecString, VecRcCellint

AddComplex T, Complex T
 = AddComplexT, ComplexT

std::mem::size_of RefCell String()  // maybe a bit much?
 = std::mem::size_of::RefCellString())

 I've patched that into libsyntax and `make check` passes...

 ... after changing some macros, since it basically means that adjacent
 identifiers parse as a single type (or expression, if we omit `::`
 too) and some macros try to match `($x:ty fake_keyword_ident ...)`, or
 have a case for `($x:expr)` and another for `(fake_keyword $x:expr)`, or
 just `($t:ty)*`. Seems like just chomping down on all adjacent
 identifiers makes the parser pretty aggressive...

 Yeah, okay, I don't know if this is really a good idea, and it's
 probably not RFC-worthy at this point, but imo it does make the syntax a
 bit easier on the eyes, and I think that's something we ought to look at
 at some point.

 ___
 Rust-dev mailing list
 Rust-dev@mozilla.org
 https://mail.mozilla.org/listinfo/rust-dev

___
Rust-dev mailing list
Rust-dev@mozilla.org
https://mail.mozilla.org/listinfo/rust-dev