diff --git a/compiler/srctran.lisp b/compiler/srctran.lisp index 019788dd0aff593e203799dcae53270f05e7bc25..014489fd091ae8a63947cb5cca00758c488a19cb 100644 --- a/compiler/srctran.lisp +++ b/compiler/srctran.lisp @@ -162,23 +162,32 @@ ;;; With the ratio and complex accessors, we pick off the "identity" case, and ;;; use a primitive to handle the cell access case. ;;; -(macrolet ((frob (fun) - `(def-source-transform ,fun (num) - (once-only ((n-num `(the rational ,num))) - `(if (ratiop ,n-num) - (%primitive ,',fun ,n-num) - ,n-num))))) - (frob numerator) - (frob denominator)) - -(macrolet ((frob (fun) - `(def-source-transform ,fun (num) - (once-only ((n-num num)) - `(if (complexp ,n-num) - (%primitive ,',fun ,n-num) - ,n-num))))) - (frob realpart) - (frob imagpart)) +(def-source-transform numerator (num) + (once-only ((n-num `(the rational ,num))) + `(if (ratiop ,n-num) + (%primitive numerator ,n-num) + ,n-num))) +;;; +(def-source-transform denominator (num) + (once-only ((n-num `(the rational ,num))) + `(if (ratiop ,n-num) + (%primitive denominator ,n-num) + 1))) +;;; +(def-source-transform realpart (num) + (once-only ((n-num num)) + `(if (complexp ,n-num) + (%primitive realpart ,n-num) + ,n-num))) +;;; +(def-source-transform imagpart (num) + (once-only ((n-num num)) + `(cond ((complexp ,n-num) + (%primitive imagpart ,n-num)) + ((floatp ,n-num) + (float 0 ,n-num)) + (t + 0)))) ;;;; Numeric Derive-Type methods: