unsafe.rkt (1133B)
1 #lang racket/base 2 3 (require (for-syntax racket/base 4 racket/contract)) 5 ;; TODO: make this a vector in the implementation, but make TR think it's a 6 ;; list (via a contract?) 7 (provide (except-out (struct-out ivector) make-ivector*) 8 make-ivector) 9 (struct ivector (v) #:mutable 10 #:constructor-name make-ivector* 11 #:transparent 12 #:methods gen:custom-write 13 [(define (write-proc iv port mode) 14 (case mode 15 [(#t) (write (raw-ivector-v iv) port)] 16 [(#f) (display (raw-ivector-v iv) port)] 17 [else (print (raw-ivector-v iv) port mode)]))]) 18 19 (define raw-ivector-v? (make-parameter #f)) 20 (define (raw-ivector-v iv) 21 (parameterize ([raw-ivector-v? #t]) 22 (ivector-v iv))) 23 24 (define (make-ivector v) 25 (impersonate-struct (make-ivector* (apply vector-immutable v)) 26 ivector-v 27 (λ (self val) 28 (if (raw-ivector-v?) 29 val 30 (vector->list val))) 31 set-ivector-v! 32 (λ (self val) 33 (error "vector is immutable!"))))