From: Barton W. <wi...@un...> - 2014-03-27 12:58:48
|
My bike shed proposal: (defmspec $push4 (z) (let* ((o (car (pop z))) (x (if z (pop z) (wna-err o))) (l (if z (pop z) (wna-err o))) (ll (meval l))) (if z (wna-err o)) (if (and ($mapatom l) ($listp ll)) (mset l (cons '(mlist simp) (cons (meval x) (cdr ll)))) (merror "Bogus second argument to push4")))) (defmspec $pop4 (z) (let* ((o (car (pop z))) (l (if z (pop z) (wna-err o))) (ll (meval l))) (if z (wna-err o)) (cond (($listp ll) (if ($emptyp ll) (merror "Pop called on empty list") (prog2 (setq ll (cdr ll)) (pop ll) (mset l (cons '(mlist simp) ll))))) (t (merror "Bogus argument to pop4"))))) I'm not entirely comfortable with the (cons '(mlist simp) ...) instead of (cons '(mlist) ...) But without the explicit simp flag, my code 40x slower on (l : [], for i : 1 thru 10^4 do push4(x,l), for i : 1 thru 10^4 do pop4(l)); Is there a weird tellsimp that breaks push4 with (cons '(mlist simp) ...) instead of (cons '(mlist) ...)? --Barton |