clojure-rs / ClojureRS

Clojure, implemented atop Rust (unofficial)
Apache License 2.0
952 stars 27 forks source link

feat: support map application #84

Open phrohdoh opened 3 years ago

phrohdoh commented 3 years ago

Similar to #85.


Clojure 1.10.3 behavior:

({:k :v})                         ;; => Execution error (ArityException) at user/eval1 (REPL:1). Wrong number of args (0) passed to: clojure.lang.PersistentArrayMap
({:k :v} :k)                      ;; => :v
({:k :v} :x :not-found)           ;; => :not-found
({:k :v} :x :not-found :too-many) ;; => Execution error (ArityException) at user/eval1 (REPL:1). Wrong number of args (3) passed to: clojure.lang.PersistentArrayMap
({:k :v} ((fn [] :k)))            ;; => :v
bash command to generate above via the clj command-line tool one-liner: ```bash for src in '({:k :v})' '({:k :v} :k)' '({:k :v} :x :not-found)' '({:k :v} :x :not-found :too-many)' '({:k :v} ((fn [] :k)))'; do printf "%s ;; => " "$src"; clj -e "(prn $src)"; done ``` in a more human-friendly form: ```bash for src in \ '({:k :v})' \ '({:k :v} :k)' \ '({:k :v} :x :not-found)' \ '({:k :v} :x :not-found :too-many)' \ '({:k :v} ((fn [] :k)))' \ ; do printf "%s ;; => " "$src"; clj -e "$src"; done ```

ClojureRS prior to this PR:

({:k :v})                         ;; => #Condition["Execution Error: clojure.lang.PersistentListMap cannot be cast to clojure.lang.IFn"]
({:k :v} :k)                      ;; => #Condition["Execution Error: clojure.lang.PersistentListMap cannot be cast to clojure.lang.IFn"]
({:k :v} :x :not-found)           ;; => #Condition["Execution Error: clojure.lang.PersistentListMap cannot be cast to clojure.lang.IFn"]
({:k :v} :x :not-found :too-many) ;; => #Condition["Execution Error: clojure.lang.PersistentListMap cannot be cast to clojure.lang.IFn"]
({:k :v} ((fn [] :k)))            ;; => #Condition["Execution Error: clojure.lang.PersistentListMap cannot be cast to clojure.lang.IFn"]

ClojureRS with the changes in this PR applied:

({:k :v})                         ;; => #Condition["Wrong number of arguments given to function (Given: 0, Expected: [1, 2])"]
({:k :v} :k)                      ;; => :v
({:k :v} :x :not-found)           ;; => nil (todo: should be :not-found see https://github.com/clojure-rs/ClojureRS/issues/86)
({:k :v} :x :not-found :too-many) ;; => #Condition["Wrong number of arguments given to function (Given: 3, Expected: [1, 2])"]
({:k :v} ((fn [] :k)))            ;; => :v
bash command to generate above via the ClojureRS REPL one-liner: ```bash for src in '({:k :v})' '({:k :v} :k)' '({:k :v} :x :not-found)' '({:k :v} :x :not-found :too-many)' '({:k :v} ((fn [] :k)))'; do printf "%s ;; => " "$src"; cargo run -- -e "$src"; done ``` in a more human-friendly form: ```bash for src in \ '({:k :v})' \ '({:k :v} :k)' \ '({:k :v} :x :not-found)' \ '({:k :v} :x :not-found :too-many)' \ '({:k :v} ((fn [] :k)))' \ ; do printf "%s ;; => " "$src"; cargo run -- -e "$src"; done ```