www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | Submodules | README | LICENSE

values.rkt (2589B)


      1 #lang typed/racket
      2 (require "typed-untyped.rkt")
      3 (define-typed/untyped-modules
      4   (provide first-value second-value third-value fourth-value fifth-value
      5            sixth-value seventh-value eighth-value ninth-value tenth-value
      6            cons→values
      7            (rename-out [cons→values cons->values]))
      8   
      9   (define-syntax-rule (define-value-getter name accessor)
     10     (define-syntax-rule (name expr)
     11       ;; Using just (call-with values (λ () expr) accessor) does not work well
     12       ;; when expr returns AnyValues (tested with eval below).
     13       (call-with-values (λ () expr) (λ vs (accessor vs)))))
     14   
     15   (define-value-getter first-value   first)
     16   (define-value-getter second-value  second)
     17   (define-value-getter third-value   third)
     18   (define-value-getter fourth-value  fourth)
     19   (define-value-getter fifth-value   fifth)
     20   (define-value-getter sixth-value   sixth)
     21   (define-value-getter seventh-value seventh)
     22   (define-value-getter eighth-value  eighth)
     23   (define-value-getter ninth-value   ninth)
     24   (define-value-getter tenth-value   tenth)
     25   
     26   (module+ test
     27     (require typed/rackunit)
     28     (check-equal? (first-value   (values 1 2 3 4 5 6 7 8 9 10 11 12 13 14)) 1)
     29     (check-equal? (second-value  (values 1 2 3 4 5 6 7 8 9 10 11 12 13 14)) 2)
     30     (check-equal? (third-value   (values 1 2 3 4 5 6 7 8 9 10 11 12 13 14)) 3)
     31     (check-equal? (fourth-value  (values 1 2 3 4 5 6 7 8 9 10 11 12 13 14)) 4)
     32     (check-equal? (fifth-value   (values 1 2 3 4 5 6 7 8 9 10 11 12 13 14)) 5)
     33     (check-equal? (sixth-value   (values 1 2 3 4 5 6 7 8 9 10 11 12 13 14)) 6)
     34     (check-equal? (seventh-value (values 1 2 3 4 5 6 7 8 9 10 11 12 13 14)) 7)
     35     (check-equal? (eighth-value  (values 1 2 3 4 5 6 7 8 9 10 11 12 13 14)) 8)
     36     (check-equal? (ninth-value   (values 1 2 3 4 5 6 7 8 9 10 11 12 13 14)) 9)
     37     (check-equal? (tenth-value   (values 1 2 3 4 5 6 7 8 9 10 11 12 13 14)) 10)
     38     ;; eval returns AnyValues, which behaves differently
     39     (let ([ev '(values 1 2 3 4 5 6 7 8 9 10 11 12 13 14)])
     40       (check-equal? (first-value   (eval ev)) 1)
     41       (check-equal? (second-value  (eval ev)) 2)
     42       (check-equal? (third-value   (eval ev)) 3)
     43       (check-equal? (fourth-value  (eval ev)) 4)
     44       (check-equal? (fifth-value   (eval ev)) 5)
     45       (check-equal? (sixth-value   (eval ev)) 6)
     46       (check-equal? (seventh-value (eval ev)) 7)
     47       (check-equal? (eighth-value  (eval ev)) 8)
     48       (check-equal? (ninth-value   (eval ev)) 9)
     49       (check-equal? (tenth-value   (eval ev)) 10)))
     50   
     51   (define #:∀ (A B) (cons→values [x : (Pairof A B)]) (values (car x) (cdr x))))