использование clojure.contrib.strint со строкой, определенной в другом месте - PullRequest
3 голосов
/ 12 августа 2011

Я новичок в clojure и пытаюсь использовать clojure.contrib.strint для создания URL.например, я мог бы использовать это для поиска Google:

(def search_base_url "http://www.google.com/search?hl=en&q=~{query}")

(defn search_url [search_term]
  (let [query (.replaceAll search_term "\\s+" "+")]
    (<< search_base_url)))

Но это дает мне ошибку компилятора:
ошибка: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.IllegalArgumentException: Метод сопоставления не найден: indexOf для класса clojure.lang.Symbol.
Я думаю, что strint использует indexOf несколько раз, поэтому почему-то я не даю функции << то, что она хочет, кажется.</p>

Я также пытался (def search_base_url '(<< "http://myurl.com?~{params}")), но тогда я не могу понять, как оценить эту форму в контексте моего let.Я мог бы просто вставить строку в функцию search_url, но мне это хуже, и я надеюсь, что ответ на этот вопрос поможет мне лучше понять clojure.

Спасибо

Ответы [ 2 ]

1 голос
/ 17 августа 2011

Проблема в том, что макрос «<<» ожидает строку, а не что-то, что вычисляется как строка. То есть он пытается вызвать .indexOf для символа с именем "search_base_url", а не для его значения. </p>

Итак, один из способов исправить это:

(defn search-url [search-term]
  (let [query (.replaceAll search-term "\\s+" "+")]
    (<< "http://www.google.com/search?hl=en&q=~{query}")))
0 голосов
/ 12 августа 2011

Я посмотрел исходный код << на github ... и не смог заставить его работать так, как вы хотите.

НО

Если вы переписываете макрос следующим образом:

(defmacro <<<
    [string]
      `(apply str (map #(eval %) (interpolate ~string))))

Затем

(def query "queryitem")
(def basesearch "http://www.google.com/search?hl=en&q=~{query}")

(<<< basesearch)

Вернет

"http://www.google.com/search?hl=en&q=queryitem"

Что вам нужно.Причина:

 (interpolate basesearch)

возвращает ленивый-seq, который не выполняет оценку последовательности:

 ("http://www.google.com/search?hl=en&q=" query "")

Символ query никогда не вычисляется в макросе << ивозвращается как есть.

Так как silent-read и interpolate являются частными, вам придется выполнить копирование, но окончательное использование довольно круто.

...