No I hadn't considered the variant using type?. Thanks for this. Not quite sure if I'm happy about it as I would prefer to have the type checking at one place instead of providing a type each time I check/use options.
-- Manfred On Sun, 30 Nov 2014 14:36:26 -0500 Matthias Felleisen <matth...@ccs.neu.edu> wrote: > > Have you considered this: > > #lang typed/racket > > (define-type Myopt (U String Boolean Integer)) > (define-type OptList (Listof (Pairof Symbol Myopt))) > > > (: olist OptList) > (define olist > (list '(dir . ".") > '(verbose . #t) > '(size . 12))) > > ; This is a fake type, where the "filter" flows into the result > ; (: optval (-> Symbol OptList (-> Any Boolean : Type) Type)) > (define-syntax-rule > (optval v ol type?) > (let ([val (assoc v ol)]) > (if (and val (type? (cdr val))) > (cdr val) > (error "Unexpected option encountered")))) > > (: process (-> OptList Void)) > (define (process ol) > (define s (optval 'size ol integer?)) > (if (< s 0) > (displayln "wrong value") > (displayln "ok"))) > > (process olist) > > > > On Nov 30, 2014, at 10:38 AM, Manfred Lotz wrote: > > > On Sun, 30 Nov 2014 09:25:57 -0500 > > Sam Tobin-Hochstadt <sa...@cs.indiana.edu> > > wrote: > > > >> I think this is exactly what you need. You could write (< (assert s > >> integer?) 0) or (and s (integer? s) (< s 0)), which mostly do the > >> same thing. > >> > >> But the fundamental issue is that this program is well-typed: > >> > >> (process (list (cons 'size "hi"))) > >> > >> since that's a perfectly valid `OptList`. If you didn't have a > >> dynamic check in `process`, you'd end up with (< "hi" 0) which is > >> wrong. > >> > >> If that's not what you want, what should the restrictions on > >> `OptList` be? > >> > > > > In my real program I have an OptList with 15 options or so, all > > known at compile time. Don't know if this helps to make it simpler. > > > > Actually, I had hoped to be able to put the cast into the optval > > procedure but I wasn't successful in doing this. > > > > Or factoring it out in some way so that I do not need to write the > > cast or assert? each time I use an option. > > > > I played a bit and found this: > > > > > > (define-syntax-rule (optval v ol) > > (let ([vv (_optval v ol)]) > > (case v > > ['size (cast vv Integer)] > > ['dir (cast vv String)] > > ['verbose (cast vv Boolean)] > > [else (error "bad option")]))) > > > > by renaming previous optval to _optval. This works fine but I have > > two questions: > > > > 1. You offered assert? as an alternative. Is this preferable in > > comparison to cast? > > > > 2. My solution seems to be bad because the decision about the type > > happens at runtime. > > > > It would be better I could redefine optval in a way that this will > > be done at compile time as I always call optval with an explicit > > option symbol. > > > > Is this possible? I'm afraid y knowledge about define-syntax-rule > > isn't really good. > > > > > > Thanks. > > > > > > -- > > Manfred > > > > > > > > > > > >> Sam > >> > >> > >> > >> On Sun, Nov 30, 2014 at 8:46 AM, Manfred Lotz > >> <manfred.l...@arcor.de> wrote: > >>> Well, I should have added that I've found this: > >>> > >>> (: process (-> OptList Void)) > >>> (define (process ol) > >>> (let ([s (optval 'size ol)]) > >>> (if (and s (< (cast s Integer) 0)) > >>> (displayln "wrong value") > >>> (displayln "ok"))) > >>> ) > >>> > >>> > >>> but I didn't find this really nice. Actually, I was hoping for > >>> something more concise. > >>> > >>> -- > >>> Manfred > >>> > >>> > >>> On Sun, 30 Nov 2014 10:13:48 +0100 > >>> Manfred Lotz <manfred.l...@arcor.de> wrote: > >>> > >>>> Hi there, > >>>> I've got another problem with typed racket. > >>>> > >>>> Let us say I have an assoc list with options for a program. These > >>>> options could be of type String, Boolean, or Integer. > >>>> > >>>> Now in my program I want to check certain options but I don't > >>>> know how to do without Typed Racket screaming at me. > >>>> > >>>> Here a minimal example: > >>>> > >>>> #lang typed/racket > >>>> > >>>> (define-type Myopt (U String Boolean Integer)) > >>>> (define-type OptList (Listof (Pairof Symbol Myopt))) > >>>> > >>>> > >>>> (: olist OptList) > >>>> (define olist (list '(dir . ".") > >>>> '(verbose . #t) > >>>> '(size . 12))) > >>>> > >>>> (: optval (-> Symbol OptList Myopt)) > >>>> (define (optval v ol) > >>>> (let ([val (assoc v ol)]) > >>>> (if val > >>>> (cdr val) > >>>> (error "Unexpected option encountered")))) > >>>> > >>>> (: process (-> OptList Void)) > >>>> (define (process ol) > >>>> (if (< (optval 'size ol) 0) > >>>> (displayln "wrong value") > >>>> (displayln "ok"))) > >>>> > >>>> > >>>> I get an error: > >>>> Type Checker: type mismatch > >>>> expected: Real > >>>> given: Myopt > >>>> in: (optval (quote size) ol) > >>>> > >>>> > >>>> How could I solve this? > >>>> > >>>> > >>> > >>> > >>> > >>> ____________________ > >>> 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 > > ____________________ > Racket Users list: > http://lists.racket-lang.org/users > ____________________ Racket Users list: http://lists.racket-lang.org/users