; code for managing the language-specific backend (in-package "VERRAZANO") ; represents the state of the backend (defstruct backend-state definitions) ; entry point for backends to add methods to (defgeneric generate-package (backend def-queue config)) ; generate an ordered list of elements to define (defun generate-definition-queue (ir) (let ((state (make-backend-state :definitions nil))) (queue-definitions ir state) (unmark-graph ir) (generated-ordered-queue state))) ; queue up all the definitions in the IR (defun queue-definitions (ir state) (apply-to-nodes #'(lambda (n) (queue-node-definitions n state)) ir '(defines))) ; queue the definitions of a node (defun queue-node-definitions (node state) (apply-to-outgoing #'(lambda (e) (push (list node e (edge-target e)) (backend-state-definitions state))) node '(defines))) ; generate an ordered queue of definitions (defun generated-ordered-queue (state) (sort (backend-state-definitions state) #'< :key #'(lambda (seqelt) (node-order (caddr seqelt)))))