Uploaded image for project: 'Clojure'
  1. CLJ-1583

Apply forces the evaluation of one element more than necessary

    Details

    • Type: Improvement
    • Status: Open
    • Priority: Major
    • Resolution: Unresolved
    • Affects versions: None
    • Fix versions: None
    • Labels:
      None
    • Patch:
      Code

      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
      

        Attachments

          Activity

            People

            • Assignee:
              Unassigned
              Reporter:
              bronsa Nicola Mometto
            • Votes:
              2 Vote for this issue
              Watchers:
              5 Start watching this issue

              Dates

              • Created:
                Updated: