Я работаю над макросом Clojure, чтобы помочь в создании JPanels на основе GridBagLayout. Я могу получить классы Java в карте значений по умолчанию внутри макроса для определения пространства имен, но не для тех, которые передаются в качестве аргументов. Какое волшебное сочетание обратных цитат, цитат, тильд или чего-то еще мне нужно?
(import [java.awt GridBagConstraints GridBagLayout Insets]
[javax.swing JButton JPanel])
(defmacro make-constraints [gridx gridy & constraints]
(let [defaults
{:gridwidth 1 :gridheight 1 :weightx 0 :weighty 0
:anchor 'GridBagConstraints/WEST :fill 'GridBagConstraints/NONE
:insets `(Insets. 5 5 5 5) :ipadx 0 :ipady 0}
values
(assoc (merge defaults (apply hash-map constraints))
:gridx gridx :gridy gridy)]
`(GridBagConstraints. ~@(map (fn [value]
(if
(or
(number? value)
(string? value)
(char? value)
(true? value)
(false? value)
(nil? value))
value
`~value))
(map values
[:gridx :gridy :gridwidth :gridheight
:weightx :weighty :anchor :fill
:insets :ipadx :ipady])))))
Когда я использую Insets
, определенный на карте значений по умолчанию, он квалифицируется (не как «захваченный символ») как (java.awt.Insets ...)
:
user=> (macroexpand-1 '(make-constraints 0 0 :weightx 1))
(java.awt.GridBagConstraints.
0 0 1 1 1 0
GridBagConstraints/WEST GridBagConstraints/NONE
(java.awt.Insets. 5 5 5 5) 0 0)
но когда я передаю это как аргумент, это не так:
user=> (macroexpand-1 '(make-constraints 1 1 :insets (Insets. 2 2 2 2)))
(java.awt.GridBagConstraints.
1 1 1 1 0 0
GridBagConstraints/WEST GridBagConstraints/NONE
(Insets. 2 2 2 2) 0 0)
Я не просто пытаюсь быть сторонником. Я получаю ошибки компилятора, что он не может найти правильный GridBagConstraints
конструктор.