Clojure

Definline functions do not work as higher-order functions when AOT compiled

Details

  • Type: Defect Defect
  • Status: Closed Closed
  • Priority: Blocker Blocker
  • Resolution: Declined
  • Affects Version/s: Release 1.5
  • Fix Version/s: None
  • Component/s: None
  • Labels:
  • Environment:
    OSX 10.8, Linux
  • Patch:
    Code and Test

Description

See discussion on Clojure group: https://groups.google.com/d/topic/clojure/v0ipoiP8X1o/discussion

Functions defined with definline appear to misbehave when AOT compiled and used with higher-order functions - it seems like the macro function is stored instead of the expansion. I've attached a small test project here reproducing the issue. It can be run with:

lein compile
lein uberjar
java -jar target/aot-test-0.1.0-SNAPSHOT-standalone.jar

The relevant part of the test namespace is:

(definline java-list? [element]
  `(instance? List ~element))

(defn -main [& args]
  (println (java-list? 2))
  (println ((var-get #'java-list?) 2))
  (println (filter java-list? [1 2 3]))
  (println (map java-list? [1 2 3])))

The output produced is:

false
(clojure.core/instance? java.util.List 2)
(1 2 3)
((clojure.core/instance? java.util.List 1) (clojure.core/instance? java.util.List 2) (clojure.core/instance? java.util.List 3))

Activity

Alex Miller made changes -
Field Original Value New Value
Labels aot
Tassilo Horn made changes -
Priority Major [ 3 ] Blocker [ 1 ]
Alex Miller made changes -
Approval Triaged [ 10120 ]
Tassilo Horn made changes -
Tassilo Horn made changes -
Patch Code and Test [ 10002 ]
Tassilo Horn made changes -
Environment OSX 10.8 OSX 10.8, Linux
Alex Miller made changes -
Resolution Declined [ 2 ]
Approval Triaged [ 10120 ]
Status Open [ 1 ] Closed [ 6 ]

People

Vote (1)
Watch (3)

Dates

  • Created:
    Updated:
    Resolved: