(defun assemble (code) (let ((length 0) (labels nil)) ;;; first path (dolist (instr code) (if (atom instr) (push (cons instr length) labels) (incf length))) ;;; second path (let ((addr 0) (code-vector (make-array length))) (dolist (instr code) (unless (atom instr) (if (member (car instr) '(jump fjump)) (setf (cadr instr) (cdr (assoc (cadr instr) labels)))) (setf (aref code-vector addr) instr) (incf addr))) code-vector)))