|
458 | 458 | (refine-variance! names stys tvarss)) |
459 | 459 |
|
460 | 460 |
|
461 | | -(define ((make-extract check-field-type customized-proc check-doms-rng) |
| 461 | +(define ((make-extract check-field-type check-doms-rng error-msg) |
462 | 462 | ty-stx st-name fld-names desc) |
463 | 463 | (syntax-parse ty-stx |
464 | 464 | #:literals (struct-field-index) |
|
487 | 487 |
|
488 | 488 | [ty-stx:st-proc-ty^ |
489 | 489 | #:do [(define ty (parse-type #'ty-stx))] |
490 | | - (match ty |
491 | | - [(Fun: (list arrs ...)) |
492 | | - (make-Fun |
493 | | - (map (lambda (arr) |
494 | | - (Arrow-update |
495 | | - arr |
496 | | - dom |
497 | | - rng |
498 | | - (lambda (doms rng) |
499 | | - (match (car doms) |
500 | | - [(Name/simple: n) |
501 | | - #:when (free-identifier=? n st-name) |
502 | | - (void)] |
503 | | - [(App: (Name/simple: rator) vars) |
504 | | - #:when (free-identifier=? rator st-name) |
505 | | - (void)] |
506 | | - [(Univ:) |
507 | | - (void)] |
508 | | - [(or (Name/simple: (app syntax-e n)) n) |
509 | | - (tc-error/fields "type mismatch in the first parameter of the function for prop:procedure" |
510 | | - "expected" (syntax-e st-name) |
511 | | - "got" n |
512 | | - #:stx (st-proc-ty-property #'ty-stx))]) |
513 | | - (if check-doms-rng |
514 | | - (check-doms-rng #'ty-stx (cdr doms) rng) |
515 | | - (values (cdr doms) rng))))) |
516 | | - arrs))] |
517 | | - [_ |
518 | | - (tc-error/fields "type mismatch" |
519 | | - "expected" |
520 | | - "Procedure" |
521 | | - "given" |
522 | | - ty |
523 | | - #:stx #'ty-stx)])] |
524 | | - [_ |
525 | | - (customized-proc ty-stx)])) |
526 | | - |
527 | | -(define-syntax-rule (define-property-handling-table (name check-field-type custimized-handling rng-chck) ...) |
528 | | - (make-immutable-free-id-table (list (cons name (make-extract check-field-type custimized-handling rng-chck)) |
| 490 | + (check-doms-rng #'ty-stx ty st-name) |
| 491 | + ] |
| 492 | + [_ (tc-error/stx ty-stx error-msg)])) |
| 493 | + |
| 494 | +(define-syntax-rule (define-property-handling-table (name check-field-type rng-chck error-msg) ...) |
| 495 | + (make-immutable-free-id-table (list (cons name (make-extract check-field-type rng-chck error-msg)) |
529 | 496 | ...))) |
530 | 497 |
|
531 | 498 | (define property-handling-table |
|
541 | 508 | ty |
542 | 509 | #:stx ty-stx)) |
543 | 510 | ty) |
544 | | - (lambda (ty-stx) |
545 | | - (tc-error/stx ty-stx |
546 | | - "expected: a nonnegative integer literal or an annotated lambda")) |
547 | | - #f) |
548 | | - (#'prop:evt? |
| 511 | + (lambda (ty-stx ty st-name) |
| 512 | + (match ty |
| 513 | + [(Fun: (list arrs ...)) |
| 514 | + (make-Fun |
| 515 | + (map (lambda (arr) |
| 516 | + (Arrow-update |
| 517 | + arr |
| 518 | + dom |
| 519 | + (lambda (doms) |
| 520 | + (match (car doms) |
| 521 | + [(Name/simple: n) |
| 522 | + #:when (free-identifier=? n st-name) |
| 523 | + (void)] |
| 524 | + [(App: (Name/simple: rator) vars) |
| 525 | + #:when (free-identifier=? rator st-name) |
| 526 | + (void)] |
| 527 | + [(Univ:) |
| 528 | + (void)] |
| 529 | + [(or (Name/simple: (app syntax-e n)) n) |
| 530 | + (tc-error/fields "type mismatch in the first parameter of the function for prop:procedure" |
| 531 | + "expected" (syntax-e st-name) |
| 532 | + "got" n |
| 533 | + #:stx (st-proc-ty-property ty-stx))]) |
| 534 | + (cdr doms)))) |
| 535 | + arrs))] |
| 536 | + [_ |
| 537 | + (tc-error/fields "type mismatch" |
| 538 | + "expected" |
| 539 | + "Procedure" |
| 540 | + "given" |
| 541 | + ty |
| 542 | + #:stx ty-stx)])) |
| 543 | + "expected: a nonnegative integer literal or an annotated lambda") |
| 544 | + (#'prop:evt |
549 | 545 | (lambda (ty-stx field-name ty) |
550 | 546 | (if (Evt? ty) |
551 | 547 | ty |
552 | 548 | (make-Evt (Un)))) |
553 | | - (lambda (ty-stx) |
554 | | - (tc-error/stx ty-stx |
555 | | - "expected: a nonnegative integer literal, an annotated lambda that returns an event, or an event")) |
556 | | - (lambda (ty-stx doms rng) |
557 | | - (unless (zero? (length doms)) |
558 | | - (tc-error/stx ty-stx |
559 | | - "expected: a function that takes only one argument")) |
560 | | - (if (Evt? rng) |
561 | | - (values doms rng) |
562 | | - (values doms (-mu x (make-Evt x)))))))) |
| 549 | + (lambda (ty-stx ty st-name) |
| 550 | + (match ty |
| 551 | + [(Fun: (list (Arrow: doms _ _ (Values: (list (Result: rng_t _ _)))))) |
| 552 | + (unless (= (length doms) 1) |
| 553 | + (tc-error/stx ty-stx |
| 554 | + "expected: a function that takes only one argument")) |
| 555 | + (if (Evt? rng_t) |
| 556 | + rng_t |
| 557 | + (-mu x (make-Evt x)))] |
| 558 | + [_ (if (Evt? ty) |
| 559 | + ty |
| 560 | + (tc-error/stx ty-stx |
| 561 | + "expected: a nonnegative integer literal, an annotated lambda that returns an event, or an event"))])) |
| 562 | + "expected: a nonnegative integer literal, an annotated lambda that returns an event, or an event"))) |
563 | 563 |
|
564 | 564 |
|
565 | 565 |
|
|
0 commit comments