Correct, that's what I mean by non-classical types.
On Jul 13, 2014, at 7:01 PM, Robby Findler wrote: > I think the examples suggest that you don't need to track the multiple values > independently from each other but that you need to track the number of values > separately from what the values actually are. > > Robby > > On Sunday, July 13, 2014, Matthias Felleisen <[email protected]> wrote: > > Both issues are really about the idea that lazy languages > delay the right-hand side of definitions until the program > has determined what is in demand (and what isn't). > > 1. As you point out (define x y) thus imposes a large cost > on lazy programs. But that's the whole point of laziness. > It is less expressive than strictness and it is more expensive, > because everything happens at higher order type levels (not > type in the static sense). > > 2. This slogan also explains the 'values' problem. An MV > communication is a parallel flow of values. When this parallel > flow connects a right-hand side with a left-hand side, its > individual pieces must be delayed. If not, the delay may or > may not be necessary because the pieces may end up in a strict > position. So at least in principle the question of whether an > expression in a value position must be delayed is something to > be computed. > > A classical type system may or may not provide the answer. > A non-classical one will, by definition of the word 'type'. > > -- Matthias > > > > > > > > > On Jul 13, 2014, at 4:38 AM, Eli Barzilay wrote: > > > On Fri, Jul 11, 2014 at 1:41 AM, Stephen Chang <[email protected]> wrote: > >> Actually, this is a bug, because the expression in a single-argument > >> values call is forced prematurely. > > > > IMO, the whole treatment of multiple values is a hack, for obvious > > reasons. I was never happy with it, and debated whether the lazy > > language should just drop them completely. Eventually, I kept them to > > make it more similar to plain racket, and to be able to talk to non-lazy > > code that may use them. > > > > The issue here is a good example for why it's a hack, with no good > > solution. IIUC, (I can't actually try it), the patch that was merged > > fixes this: > > > >> eg, This should not error: > >> > >> -> (let-values ([(x) (values (error "a"))]) 1) > >> ; a [,bt for context] > >> > >> Just like this does not error. > >> > >> -> (let-values ([(x y) (values (error "a") (error "b"))]) 1) > >> 1 > > > > and makes the former return 1, but now you get a different kind of > > breakage where > > > > (let-values ([(x) (values (error "a"))]) 1) > > (let-values ([(x) (error "a") ]) 1) > > > > are not the same. More than that, the hack of dealing with multiple > > values is at such a (bad) level, that it's possible that the patch would > > break code that assumes that `E' is equivalent to (values E). > > > > A more proper way to deal with `*-values' constructs would be for the > > macro to treat a case of != 0 values differently from a single value, so > > the force that breaks the above is not done. That is, this kind of > > change would make these two: > > > >> (let-values ([(x) (values (error "poof"))]) 1) > > 1 ; `values' doesn't wrap, but (x) means no !-ing > >> (let-values ([(x y) (values (error "poof"))]) 1) > > poof ; since now there are (x y) so the macro !s the RHS > > > > This is clearly not great either, but I think that overall it would be > > more consistent. (But of course it's not a 10-second fix.) > > > > (A much better way to deal with MVs is to have "TLR" (= TR+LR).) > > > > -- > > ((lambda (x) (x x)) (lambda (x) (x x))) Eli Barzilay: > > http://barzilay.org/ Maze is Life! > > ____________________ > > Racket Users list: > > http://lists.racket-lang.org/users > > ____________________ > Racket Users list: > http://lists.racket-lang.org/users
____________________ Racket Users list: http://lists.racket-lang.org/users

