|
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