
There are still five errors, but they seem to be errors in the sample collector. But I need to find out.
21 lines
872 B
Racket
21 lines
872 B
Racket
#lang scheme
|
|
|
|
(provide/contract (find-referenced-locals ((listof identifier?) syntax? . -> . (listof identifier?))))
|
|
(define (find-referenced-locals env-ids stx)
|
|
(local ([define id-hash (make-custom-hash free-identifier=?
|
|
(λ (v) (equal-hash-code (syntax->datum v)))
|
|
(λ (v) (equal-secondary-hash-code (syntax->datum v))))]
|
|
[define (find stx)
|
|
(syntax-case stx ()
|
|
[(head . tail)
|
|
(begin
|
|
(find #'head)
|
|
(find #'tail))]
|
|
[id (identifier? stx)
|
|
(begin
|
|
(unless (dict-ref id-hash stx false)
|
|
(dict-set! id-hash stx true)))]
|
|
[_ (void)])])
|
|
(find stx)
|
|
(filter (λ (env-id) (dict-ref id-hash env-id false)) env-ids)))
|