[vector] checkpoint: parse-vector-length
This commit is contained in:
parent
8a6411cae2
commit
c0b53a0441
59
test/vector-pass.rkt
Normal file
59
test/vector-pass.rkt
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
#lang typed/racket/base
|
||||||
|
|
||||||
|
(module+ test
|
||||||
|
(require
|
||||||
|
trivial/vector
|
||||||
|
typed/rackunit)
|
||||||
|
|
||||||
|
(require/typed (for-template trivial/vector)
|
||||||
|
(parse-vector-length (-> Syntax (Option Natural))))
|
||||||
|
|
||||||
|
;; -- parse-vector-length
|
||||||
|
;; --- '#
|
||||||
|
(check-equal?
|
||||||
|
(parse-vector-length #'#())
|
||||||
|
0)
|
||||||
|
; (check-equal?
|
||||||
|
; (parse-vector-length #`#,'#(1 2))
|
||||||
|
; 2)
|
||||||
|
(check-equal?
|
||||||
|
(parse-vector-length #'#(1 2 3 4))
|
||||||
|
4)
|
||||||
|
(check-equal?
|
||||||
|
(parse-vector-length #'#(a b c e s aue d al))
|
||||||
|
8)
|
||||||
|
;; --- vector
|
||||||
|
(check-equal?
|
||||||
|
(parse-vector-length #'(vector))
|
||||||
|
0)
|
||||||
|
(check-equal?
|
||||||
|
(parse-vector-length #'(vector 0 1))
|
||||||
|
2)
|
||||||
|
;; --- make-vector
|
||||||
|
(check-equal?
|
||||||
|
(parse-vector-length #'(make-vector -1 1))
|
||||||
|
#f)
|
||||||
|
(check-equal?
|
||||||
|
(parse-vector-length #'(make-vector 0 8))
|
||||||
|
0)
|
||||||
|
(check-equal?
|
||||||
|
(parse-vector-length #'(make-vector 3 3))
|
||||||
|
3)
|
||||||
|
(check-equal?
|
||||||
|
(parse-vector-length #'(make-vector 99))
|
||||||
|
99)
|
||||||
|
;; --- build-vector
|
||||||
|
(check-equal?
|
||||||
|
;; Type error
|
||||||
|
(parse-vector-length #'(build-vector -1))
|
||||||
|
#f)
|
||||||
|
(check-equal?
|
||||||
|
(parse-vector-length #'(build-vector 0 (lambda (x) x)))
|
||||||
|
0)
|
||||||
|
(check-equal?
|
||||||
|
(parse-vector-length #'(build-vector 3 (lambda (x) 8)))
|
||||||
|
3)
|
||||||
|
(check-equal?
|
||||||
|
(parse-vector-length #'(build-vector 61 add1))
|
||||||
|
61)
|
||||||
|
)
|
59
vector.rkt
Normal file
59
vector.rkt
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
#lang typed/racket/base
|
||||||
|
|
||||||
|
(provide
|
||||||
|
define-vector:
|
||||||
|
;let-vector:
|
||||||
|
;vector-length:
|
||||||
|
;vector-ref:
|
||||||
|
;vector-set!:
|
||||||
|
;vector-map:
|
||||||
|
;vector-append:
|
||||||
|
|
||||||
|
;; TODO and a few more
|
||||||
|
|
||||||
|
;; --- private
|
||||||
|
(for-syntax parse-vector-length)
|
||||||
|
)
|
||||||
|
|
||||||
|
;; -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(require
|
||||||
|
(for-syntax
|
||||||
|
typed/racket/base
|
||||||
|
syntax/id-table
|
||||||
|
syntax/parse
|
||||||
|
syntax/stx
|
||||||
|
))
|
||||||
|
|
||||||
|
;; =============================================================================
|
||||||
|
|
||||||
|
(define-for-syntax vec-length-key 'vector:length)
|
||||||
|
(define-for-syntax errloc-key 'vector:)
|
||||||
|
(define-for-syntax id+vector-length (make-free-id-table))
|
||||||
|
|
||||||
|
(define-syntax (define-vector: stx)
|
||||||
|
(syntax-parse stx
|
||||||
|
[(_ name:id v)
|
||||||
|
#:with len (parse-vector-length #'v)
|
||||||
|
#:when (syntax-e #'len)
|
||||||
|
(free-id-table-set! id+vector-length
|
||||||
|
#'name
|
||||||
|
(syntax-e #'len))
|
||||||
|
#'(define name v)]
|
||||||
|
[(_ e* ...)
|
||||||
|
#'(define e* ...)]))
|
||||||
|
|
||||||
|
;; Assume `stx` is creating a vector; get the length of the vector to-be-made
|
||||||
|
(define-for-syntax (parse-vector-length stx)
|
||||||
|
(syntax-parse stx #:literals (vector make-vector build-vector)
|
||||||
|
[(~or '#(e* ...)
|
||||||
|
#(e* ...)
|
||||||
|
;; TODO #{} #[] #6{} ...
|
||||||
|
(vector e* ...))
|
||||||
|
(length (syntax->list #'(e* ...)))]
|
||||||
|
[(make-vector n:nat e* ...)
|
||||||
|
(syntax-e #'n)]
|
||||||
|
[(build-vector n:nat f)
|
||||||
|
(syntax-e #'n)]
|
||||||
|
[_ #f]))
|
||||||
|
|
Loading…
Reference in New Issue
Block a user