Created
February 1, 2022 04:15
-
-
Save michaelballantyne/f6bc234be515fb7b927b28c2ab750cc6 to your computer and use it in GitHub Desktop.
Compute the set of primitives used in an s-expression linklet
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#lang racket/base | |
(require racket/list racket/set racket/string racket/match) | |
(define (local? sym) | |
(define str (symbol->string sym)) | |
(define trimmed (string-trim str #rx"_[0-9]+" #:left? #f)) | |
(not (equal? str trimmed))) | |
(define (get-primitives l) | |
(define locally-defined (set)) | |
(define (add-locally-defined! sym) | |
(set! locally-defined (set-add locally-defined sym))) | |
(define references (set)) | |
(define (add-reference! sym) | |
(when (not (local? sym)) | |
(set! references (set-add references sym)))) | |
(define (traverse-body stmts) | |
(for ([stmt stmts]) | |
(match stmt | |
[`(define-values ,bound-names ,rhs) | |
(for ([sym bound-names]) | |
(add-locally-defined! sym)) | |
(traverse-expr rhs)] | |
[_ (traverse-expr stmt)]))) | |
(define (traverse-expr e) | |
(match e | |
[`(lambda ,formals ,body) | |
(traverse-expr body)] | |
[`(case-lambda . ,(list (list formals exprs) ...)) | |
(map traverse-expr exprs)] | |
[`(,(or 'begin 'begin0) . ,exprs) | |
(map traverse-expr exprs)] | |
[`(if ,e1 ,e2 ,e3) | |
(traverse-expr e1) | |
(traverse-expr e2) | |
(traverse-expr e3)] | |
[`(,(or 'letrec-values 'let-values) ,(list (list _ rhs) ...) ,body) | |
(map traverse-expr rhs) | |
(traverse-expr body)] | |
[`(set! ,_ ,e) | |
(traverse-expr e)] | |
[`(with-continuation-mark ,e1 ,e2 ,e3) | |
(traverse-expr e1) | |
(traverse-expr e2) | |
(traverse-expr e3)] | |
[`(#%variable-reference . ,_) | |
(void)] | |
[`(quote ,_) | |
(void)] | |
[(? symbol?) | |
(add-reference! e)] | |
[(or (? number?) (? boolean?) (? string?) (? bytes?)) | |
(void)] | |
[(list es ...) | |
(map traverse-expr es)] | |
[_ (error 'traverse-expr "not handled: ~v" e)])) | |
(match l | |
[`(,_ ,imports ,exports . ,body) | |
(traverse-body body)]) | |
(set->list (set-subtract references locally-defined))) | |
#;(begin | |
(define path "/Users/michaelballantyne/racket/racket/src/expander/compiled/exp.zo") | |
(define l (read (open-input-file path))) | |
(define prims (get-primitives l))) | |
;> (length prims) | |
;503 | |
;> prims | |
;'(list->string | |
; abort-current-continuation | |
; unsafe-end-atomic | |
; fx- | |
; port-read-handler | |
; string | |
; current-logger | |
; hash-eqv? | |
; unsafe-fx>= | |
; current-code-inspector | |
; system-library-subpath | |
; cadr | |
; - | |
; = | |
; build-path | |
; cdar | |
; exn:fail:filesystem? | |
; unsafe-fxvector-set! | |
; instance-variable-names | |
; explode-path | |
; system-type | |
; instance-describe-variable! | |
; vector | |
; srcloc-source | |
; unsafe-vector-ref | |
; call-with-escape-continuation | |
; instance? | |
; vector-set! | |
; imag-part | |
; fx< | |
; prop:impersonator-of | |
; path-element->bytes | |
; void | |
; memv | |
; make-hasheqv-placeholder | |
; path->directory-path | |
; numerator | |
; prop:evt | |
; exn-continuation-marks | |
; single-flonum-available? | |
; set-mcdr! | |
; complex? | |
; < | |
; make-continuation-prompt-tag | |
; inspector? | |
; raise | |
; not | |
; make-ephemeron | |
; unsafe-car | |
; write | |
; cadadr | |
; parameterization-key | |
; regexp-replace* | |
; procedure-arity | |
; string->path | |
; read-char-or-special | |
; cleanse-path | |
; srcloc | |
; resolve-path | |
; exact->inexact | |
; current-write-relative-directory | |
; symbol? | |
; hash-clear! | |
; list* | |
; linklet-export-variables | |
; cons | |
; instance-variable-value | |
; struct:exn:fail:filesystem | |
; byte? | |
; fixnum? | |
; read-case-sensitive | |
; sync/timeout | |
; unsafe-cdr | |
; max | |
; check-for-break | |
; unsafe-bytes-length | |
; / | |
; mcons | |
; make-struct-field-mutator | |
; eval-jit-enabled | |
; list->vector | |
; single-flonum? | |
; close-input-port | |
; variable-reference-from-unsafe? | |
; raise-result-arity-error | |
; hash-iterate-next | |
; fx> | |
; >= | |
; unsafe-flvector-set! | |
; make-struct-field-accessor | |
; make-string | |
; bytes->path | |
; fx+ | |
; current-compile-target-machine | |
; car | |
; instance-name | |
; integer->integer-bytes | |
; path->complete-path | |
; split-path | |
; raise-mismatch-error | |
; regexp-match? | |
; string->bytes/utf-8 | |
; raise-result-error | |
; zero? | |
; prop:checked-procedure | |
; byte-regexp? | |
; unsafe-vector*-ref | |
; vector*-ref | |
; plumber-add-flush! | |
; error-print-width | |
; make-inspector | |
; make-weak-box | |
; void? | |
; fx= | |
; caddr | |
; file-size | |
; make-hash-placeholder | |
; keyword->string | |
; output-port? | |
; keyword? | |
; > | |
; peek-char-or-special | |
; eof | |
; cadddr | |
; cdddr | |
; simplify-path | |
; eval-linklet | |
; unbox | |
; prop:sealed | |
; weak-box-value | |
; <= | |
; regexp-match-positions | |
; cddr | |
; semaphore-post | |
; string=? | |
; char->integer | |
; vector-immutable | |
; srcloc? | |
; list-ref | |
; eqv? | |
; unquoted-printing-string | |
; hash-for-each | |
; read-on-demand-source | |
; error-syntax->string-handler | |
; extflonum? | |
; hash? | |
; add1 | |
; arithmetic-shift | |
; hash-count | |
; string->bytes/locale | |
; port-count-lines! | |
; vector-length | |
; unsafe-bytes-ref | |
; raise-argument-error | |
; unsafe-start-atomic | |
; current-inexact-milliseconds | |
; unsafe-fxrshift | |
; exn:fail:out-of-memory | |
; regexp | |
; char? | |
; inspector-superior? | |
; call-with-continuation-prompt | |
; variable-reference-constant? | |
; linklet-import-variables | |
; unsafe-vector-length | |
; path? | |
; fxand | |
; bytes->string/locale | |
; default-continuation-prompt-tag | |
; denominator | |
; eof-object? | |
; subbytes | |
; expand-user-path | |
; flonum? | |
; unsafe-fx<= | |
; path-convention-type | |
; write-string | |
; make-bytes | |
; immutable? | |
; set-box*! | |
; symbol->immutable-string | |
; datum-intern-literal | |
; sync | |
; compiled-position->primitive | |
; real->single-flonum | |
; exn:fail:unsupported | |
; placeholder-set! | |
; make-ephemeron-hasheq | |
; symbol-unreadable? | |
; file-position | |
; unsafe-immutable-hash-iterate-next | |
; box | |
; semaphore-peek-evt | |
; error | |
; + | |
; make-immutable-hash | |
; prop:procedure | |
; srcloc-line | |
; arity-at-least-value | |
; hasheq | |
; filesystem-change-evt | |
; log-level? | |
; srcloc-span | |
; fxrshift | |
; make-immutable-hasheqv | |
; write-bytes | |
; rational? | |
; instance-set-variable-value! | |
; flvector-set! | |
; boolean? | |
; string-locale-downcase | |
; primitive-in-category? | |
; syntax-span | |
; char-alphabetic? | |
; equal? | |
; make-polar | |
; values | |
; make-prefab-struct | |
; fprintf | |
; error-print-source-location | |
; unbox* | |
; string->bytes/latin-1 | |
; string->immutable-string | |
; raise-arguments-error | |
; unsafe-make-place-local | |
; datum->syntax | |
; min | |
; bytes->string/utf-8 | |
; raise-type-error | |
; bytes->path-element | |
; input-port? | |
; read-bytes | |
; struct->vector | |
; unsafe-string-length | |
; string-append-immutable | |
; * | |
; flush-output | |
; path->string | |
; srcloc-column | |
; prefab-key->struct-type | |
; make-hash | |
; impersonator? | |
; syntax-source | |
; hash-remove! | |
; exn:fail:read | |
; hash-iterate-first | |
; positive? | |
; append | |
; mcdr | |
; log-message | |
; andmap | |
; instantiate-linklet | |
; print-syntax-width | |
; make-hasheq | |
; display | |
; prop:authentic | |
; error-value->string-handler | |
; unsafe-immutable-hash-iterate-key+value | |
; hash-keys-subset? | |
; absolute-path? | |
; fx->fl | |
; primitive-table | |
; integer-bytes->integer | |
; bytes-open-converter | |
; unsafe-place-local-ref | |
; path-for-some-system? | |
; hash-iterate-key | |
; real-part | |
; unsafe-immutable-hash-iterate-key | |
; exact-positive-integer? | |
; current-plumber | |
; apply | |
; reparameterize | |
; read-byte | |
; primitive-lookup | |
; vector->immutable-vector | |
; object-name | |
; current-load-extension | |
; integer? | |
; primitive->compiled-position | |
; fx<= | |
; string-set! | |
; continuation-prompt-available? | |
; unsafe-vector-set! | |
; symbol-interned? | |
; eq-hash-code | |
; string-ref | |
; char<=? | |
; vector*-length | |
; exception-handler-key | |
; open-output-bytes | |
; make-vector | |
; unsafe-fx= | |
; get-output-bytes | |
; peek-byte | |
; current-load-relative-directory | |
; prefab-struct-key | |
; struct:exn:fail | |
; syntax-property | |
; bytes=? | |
; bytes<? | |
; char-whitespace? | |
; syntax-column | |
; current-inspector | |
; fxmin | |
; file-exists? | |
; unsafe-place-local-set! | |
; unsafe-fx- | |
; file-or-directory-modify-seconds | |
; relative-path? | |
; mcar | |
; syntax-line | |
; load-on-demand-enabled | |
; bytes-convert | |
; read-linklet-bundle-hash | |
; ephemeron-value | |
; vector->list | |
; regexp? | |
; make-hasheq-placeholder | |
; unsafe-end-breakable-atomic | |
; hash-set | |
; procedure-arity-includes? | |
; current-memory-use | |
; string->number | |
; make-weak-hash | |
; length | |
; bytes-length | |
; break-enabled-key | |
; fx>= | |
; fxvector-set! | |
; byte-pregexp? | |
; ceiling | |
; unsafe-vector*-length | |
; log | |
; eq? | |
; unsafe-fx< | |
; find-system-path | |
; inexact->exact | |
; memq | |
; read-accept-bar-quote | |
; current-environment-variables | |
; write-byte | |
; bitwise-ior | |
; extend-parameterization | |
; pregexp | |
; cache-configuration | |
; syntax? | |
; list-tail | |
; open-input-file | |
; call-with-continuation-barrier | |
; make-parameter | |
; pregexp? | |
; current-print | |
; exn-message | |
; set-box! | |
; unsafe-immutable-hash-iterate-first | |
; prop:custom-write | |
; hasheqv | |
; hash-iterate-key+value | |
; make-immutable-hasheq | |
; string->symbol | |
; equal-hash-code | |
; null? | |
; gensym | |
; floating-point-bytes->real | |
; filesystem-change-evt-cancel | |
; byte-regexp | |
; null | |
; prop:exn:srclocs | |
; box-immutable | |
; path->bytes | |
; hash | |
; char=? | |
; port-next-location | |
; make-semaphore | |
; string? | |
; hash-iterate-value | |
; current-error-port | |
; exact? | |
; make-weak-hasheq | |
; make-struct-type-property | |
; unsafe-fx+ | |
; fxior | |
; never-evt | |
; hash-set! | |
; hash-eq? | |
; hash-remove | |
; integer-length | |
; current-thread | |
; logger-name | |
; modulo | |
; regexp-replace | |
; format | |
; current-output-port | |
; instance-data | |
; expt | |
; system-path-convention-type | |
; bytes-append | |
; vector-ref | |
; unsafe-start-breakable-atomic | |
; version | |
; exn:fail:contract:variable | |
; make-hasheqv | |
; hash-ref-key | |
; instance-unset-variable! | |
; exn:fail:contract? | |
; string-copy! | |
; exn:fail? | |
; extflonum-available? | |
; linklet-virtual-machine-bytes | |
; parameterization? | |
; arity-at-least? | |
; number->string | |
; vector? | |
; number? | |
; srcloc-position | |
; make-struct-type | |
; prop:equal+hash | |
; directory-list | |
; hash-copy | |
; recompile-linklet | |
; real? | |
; linklet? | |
; peek-bytes | |
; unsafe-vector*-set! | |
; with-input-from-file | |
; byte-pregexp | |
; cadar | |
; exn:fail:read:non-char | |
; real->extfl | |
; string-foldcase | |
; make-fxvector | |
; string->uninterned-symbol | |
; complete-path? | |
; negative? | |
; list? | |
; mpair? | |
; regexp-match | |
; string-append | |
; make-placeholder | |
; fx* | |
; open-input-bytes | |
; exact-integer? | |
; variable-reference? | |
; exact-nonnegative-integer? | |
; make-thread-cell | |
; caar | |
; continuation-mark-set-first | |
; quotient | |
; environment-variables-ref | |
; symbol->string | |
; string->list | |
; compile-linklet | |
; syntax-position | |
; vector-copy! | |
; prefab-key? | |
; substring | |
; make-instance | |
; for-each | |
; srcloc->string | |
; integer->char | |
; variable-reference->instance | |
; sub1 | |
; bytes? | |
; current-continuation-marks | |
; make-flvector | |
; string-length | |
; caddar | |
; exn:fail:read:eof | |
; current-directory | |
; bytes->immutable-bytes | |
; string->keyword | |
; unsafe-undefined | |
; hash-ref | |
; read-char | |
; vector*-set! | |
; raise-range-error | |
; make-reader-graph | |
; cdr | |
; current-read-interaction | |
; write-linklet-bundle-hash | |
; box? | |
; bytes-ref | |
; make-rectangular | |
; real->floating-point-bytes | |
; string->unreadable-symbol | |
; char>=? | |
; symbol<? | |
; directory-exists? | |
; syntax-e | |
; fxlshift | |
; list | |
; unsafe-struct*-cas! | |
; unsafe-root-continuation-prompt-tag | |
; caadr | |
; char-numeric? | |
; procedure? | |
; call-with-values | |
; bytes | |
; box-cas! | |
; dynamic-wind | |
; current-input-port | |
; pair?) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment