`(%rest-ref ,n ,seq ,context ,count)
(values nil t))))
-;;; CAR -> %REST-REF
+;;; CAR/FIRST -> %REST-REF
(defun source-transform-car (list)
(multiple-value-bind (context count) (possible-rest-arg-context list)
(if context
`(%rest-ref 0 ,list ,context ,count)
(values nil t))))
-(define-source-transform car (list) (source-transform-car list))
-(define-source-transform first (list) (source-transform-car list))
+(define-source-transform car (list)
+ (source-transform-car list))
+(define-source-transform first (list)
+ (or (source-transform-car list)
+ `(car ,list)))
;;; LENGTH -> %REST-LENGTH
(defun source-transform-length (list)
(declare (type (signed-byte 31) x))
(sb-c::mask-signed-field 31 (- x 1055131947))))))
(assert (= (funcall fun 10038) -1055121909))))
+
+(with-rest (:name :first-open-coded)
+ (let ((fun (compile nil `(lambda (x) (first x)))))
+ (assert (not (ctu:find-named-callees fun)))))
+
+(with-rest (:name :second-open-coded)
+ (let ((fun (compile nil `(lambda (x) (second x)))))
+ (assert (not (ctu:find-named-callees fun)))))