Повторяющаяся структура в Clojure

В книге "Веб-разработка с Clojure" сказано, что код

(defn registration-page []
    (layout/common
        (form-to [:post "/register"]
            (label "id" "screen name")
            (text-field "id")
            [:br]
            (label "pass" "password")
            (password-field "pass")
            [:br]
            (label "pass1" "retype password")
            (password-field "pass1")
            [:br]
            (submit-button "create account"))))

можно переписать с помощью вспомогательной функции следующим образом:

(defn control [field name text]
  (list (on-error name format-error)
        (label name text)
        (field name)
        [:br]))

(defn registration-page []
  (layout/common
    (form-to [:post "/register"]
      (control text-field :id "screen name")
      (control password-field :pass "Password")
      (control password-field :pass1 "Retype Password")
      (submit-button "Create Account"))))

Мой вопрос: почему в альтернативном коде значение параметра name не является строкой? Например, почему это (управляющее текстовое поле :id "экранное имя"), а не (управляющее текстовое поле "id" "экранное имя")?


person Pauli    schedule 02.12.2013    source источник


Ответы (1)


Я не знаком с Иккингом, и у меня нет упомянутой вами книги. Но, читая исходный код Hiccup, вы можете найти:

Label вызывает make-id, которую он вызывает as-str. Взгляните на эту функцию и посмотрите, что она делает.

(defn ^String as-str
  "Converts its arguments into a string using to-str."
  [& xs]
  (apply str (map to-str xs)))

Это приведет вас к протоколу ToString.

Передайте строки вместо ключевых слов в опубликованном фрагменте и посмотрите, что происходит!

Исходный код — лучшая документация, которую мы можем иметь!

person Chiron    schedule 02.12.2013