Apply forces the evaluation of one element more than necessary

Description

Given a function with one fixed argument and a vararg, it should be sufficient to force evaluation of 2 elements for apply to know which arity it should select, however it currently forces 3:

user=> (defn x ([a & b])) #'user/x user=> (apply x (map println (iterate inc 0))) 0 1 2 nil

This makes lazy functions that use apply (for example mapcat) less lazy than they could be.
The proposed patch makes RT.boundedLength short-circuit immediately after the seq count is greater than the max fixed arity:

user=> (defn x ([a & b])) #'user/x user=> (apply x (map println (iterate inc 0))) 0 1 nil

Environment

None

Attachments

1
  • 08 Nov 2014, 12:06 AM

Activity

Show:

Nicola Mometto November 9, 2014 at 9:37 PM

The patch in this ticket slightly improves the issue reported at http://dev.clojure.org/jira/browse/CLJ-1218

Details

Assignee

Reporter

Patch

Code

Priority

Created November 8, 2014 at 12:06 AM
Updated November 9, 2014 at 9:38 PM