On Fri, Jul 6, 2012 at 5:53 PM, Matthias Felleisen <matth...@ccs.neu.edu> wrote:
>
> I can't think of such a primitive other than force, for which it is okay. Can 
> you be concrete?

Here's a type definition;

(define-type LTree
    (U (Promise Integer) (Cons LTree LTree)))

This is just a tree of integer promises, but to traverse it, we need
to write code like:

(define (sum lt)
  (cond [(cons? lt) (+ (sum (car lt)) (sum (cdr lt)))]
           [else (force lt)]))

If `cons?` raised an error when applied to promises, we'd be out of luck.

> On Jul 6, 2012, at 5:16 PM, Robby Findler wrote:
>
>> What do you do if you have a function that accepts either promises or
>> lists? Then, you might want total predicates.
>>
>> Robby
>>
>> On Fri, Jul 6, 2012 at 2:22 PM, Matthias Felleisen <matth...@ccs.neu.edu> 
>> wrote:
>>>
>>> I just realized that Racket already suffers from the problem that 
>>> polymorphic contracts introduce.
>>>
>>> As Stephen is working out right now, Racketeers want to introduce laziness 
>>> to speed up programs on occasion. We have been told for decades that delay 
>>> and force are our friends. In a sense, this performance-refactoring problem 
>>> is exactly the same problem as incremental type refactoring aka gradual 
>>> typing. You want to add laziness in a transparent manner -- or if you make 
>>> a mistake, it should blow up on you.
>>>
>>> But it doesn't:
>>>
>>>> Welcome to DrRacket, version 5.3.0.13--2012-07-05(467bde3a/d) [3m].
>>>> Language: racket.
>>>>> (null? (delay (/ 1 0)))
>>>> #f
>>>>> (zero? (delay (/ 1 0)))
>>>> . . zero?: contract violation
>>>>  expected: number?
>>>>  given: #<promise:unsaved-editor12957:6:9>
>>>
>>> For some reasons I don't understand, our ancestors (let's not use their 
>>> name anymore) decided to make some primitives resistant to promises and 
>>> some aren't. Now imagine you accidentally package a null in a delay, which 
>>> may happen when you use lazy combinators:
>>>
>>>>> (null? (delay null))
>>>> #f
>>>
>>> Your program changes meaning and off it goes and signals an error. You 
>>> don't get a faster program, you get a program that raises the wrong kind of 
>>> error.
>>>
>>> What they should have done is signal an exception when strict primitives 
>>> receive a promise.
>>>
>>> I take it is too late to correct such a {\HUGE HUGE} historical blunder. -- 
>>> Matthias
>>>
>>>
>>> _________________________
>>>  Racket Developers list:
>>>  http://lists.racket-lang.org/dev
>
>
> _________________________
>   Racket Developers list:
>   http://lists.racket-lang.org/dev



-- 
sam th
sa...@ccs.neu.edu

_________________________
  Racket Developers list:
  http://lists.racket-lang.org/dev

Reply via email to