   [x & y]
   (message "Hi, " x " from Arcadia!")
   \a)
+
+(defn ^String wat [^String s]
+  (str s " wat?"))

                 []
                 (message "Hi,  from Arcadia!")
                 ))


(defcmd say-hello4
  "Say hello to x. Return a number."
  [String String] ;; this works. Probably a boxing error.


(defn do-thing [] (message "do-thing"))
(make-delegate [] [] do-thing)

(pprint (macroexpand '(separate-types ^:hi do-thing2 [^String a ^Object b ])))
(pprint (separate-types ^:hi ^Int32 do-thing2 [^String a ^Object b c]))
(meta #'do-thing)

(defmacro check-meta [f args & body]
          (let [m (meta &form)]
               `(list ~m (do
                                        ;                     (with-meta (defn ~f ~args ~@body) {})
                            (defn ~f ~args ~@body) 
                            (let [mf# (meta #'~f)
                                 margs# (first (:arglists mf#))]
                                 (list #_'(meta '&form)
                                       mf#
                                  (:tag mf#)
                                  (->> margs#
                                         (mapv meta)
                                         (mapv :tag))))))))
(pprint (check-meta ^:hi ^:bye ^Int32 do-thing [^String a b] 1))
(meta #'do-thing)
(pprint (macroexpand '(check-meta ^:hi do-thing [^String a] 1)))
(register-command "do-thing-cmd" [] [] 'do-thing {})
(register-command "say-hello2-cmd" [String] '[name] 'say-hello2 {:signature "(defn say-hello2 (^String name) ...)"
                  :parameter-names ["name"] :description "Say hello!"})
(defcmd say-hello3
  "Say hello to x. Return a number."
  [] ;; works
