www

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

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