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))))