;;; -*- Mode:LISP; Package:LI; Readtable:CL; Base:10 -*- ;;;; Cons Rest Args ;;; ;;; (defun f (m n o p q r) ;;; (g r q p o n m) ...) ;;; ;;; (defun g (a b c &rest z) ;;; ...) ;;; ;;; ;;; f ;;; (move O0 A5) ;;; ... ;;; (move O5 A0) ;;; (move *arg-2* '5) ;-1 ;;; (call g) ;;; ... ;;; ;;; g ;;; (move *arg-1* '3) ; ;;; (jump cons-rest (*return-pc-1* opc)) ;;; (move A3 *rest*) ;;; ... ;;; ;;;(defun cons-rest () ;(*arg-1* *arg-2*) ;;; (tagbody ;;; (setq *rest* nil) ;;; (go next) ;;; loop ;;; (push (get-arg (incf *arg-1*)) *rest*) ;;; next ;;; (unless (= *arg-1* *arg-2*) ;;; (go loop)) ;;; (hw:dispatch (1+ *return-pc-1*)))) ;;; CONS-REST ;;; called with ;;; -1 in *return-pc-1* ;;; in *arg-1* ;;; in *arg-2* ;;; returns in *rest* (defafun cons-rest () (unconditional-branch next (alu zero *rest* ignore ignore)) ;(movei *rest* 'nil) loop (movea r0 get-arg-dispatch br-greater-than) (branch get-stack-arg (alu l+r nop-no-overflow *arg-1* r0)) (alu r+1 *arg-1* ignore *arg-1*) (nop ch-open next-pc-dispatch) get-arg-dispatch (unconditional-branch cons-it (move O0 A0)) (unconditional-branch cons-it (move O0 A1)) (unconditional-branch cons-it (move O0 A2)) (unconditional-branch cons-it (move O0 A3)) (unconditional-branch cons-it (move O0 A4)) (unconditional-branch cons-it (move O0 A5)) (unconditional-branch cons-it (move O0 A6)) (unconditional-branch cons-it (move O0 A7)) (unconditional-branch cons-it (move O0 A8)) (unconditional-branch cons-it (move O0 A9)) (unconditional-branch cons-it (move O0 A10)) (unconditional-branch cons-it (move O0 A11)) (unconditional-branch cons-it (move O0 A12)) (unconditional-branch cons-it (move O0 A13)) (unconditional-branch cons-it (move O0 A14)) (unconditional-branch cons-it (move O0 A15)) cons-it (call (cons 2) *rest* (O1 *rest*)) next (alu l-r nop-no-overflow-trap *arg-1* *arg-2*) (movei r0 '15 br-not-greater-than) (branch loop (alu l-r nop-no-overflow *arg-1* r0)) done (alu r+1 nop-no-overflow-trap ignore *return-pc-1*) (nop) (nop next-pc-dispatch) get-stack-arg)