Как к defn функция от строки в Clojure?

BigQuery не имеет первичных или внешних ключей. Вы должны навязать любую семантику, подходящую для таблиц, которые вы храните. Например, у вас может быть две таблицы, связанные столбцом customer_id, и вы можете объединить таблицы, используя этот столбец, несмотря на то, что вам не нужно объявлять, что это первичный ключ в одном или внешний ключ в другом. [111 ]

15
задан mannicken 24 March 2009 в 19:24
поделиться

4 ответа

(defmacro defn-with-str [string args & body]
 `(defn ~(symbol string) ~args ~@body))

(defn-with-str "print-string" [k] (println k))

(print-string "lol")
22
ответ дан 1 December 2019 в 00:03
поделиться

Мне нравится ответ dnolen лучше, но можно сделать это также:

(defn #=(symbol "print-string") [k] (println k))

#=() оценен во время чтения. Я не знаю, насколько стабильный функция Clojure это, я не полагался бы на него для не изменения в будущем. Макросы - то, как я сделал бы это.

14
ответ дан 1 December 2019 в 00:03
поделиться

решение dnolen работает во время макрорасширения, Brian Carper во время чтения. Теперь, вот один для времени выполнения:

(intern *ns* (symbol "a") (fn [k] (println k)))
17
ответ дан 1 December 2019 в 00:03
поделиться

FYI - ответ dnolen будет работать только для буквальных строк, а не для строк в переменных def'd или let'd.

(defmacro defn-with-str [string args & body] `(defn ~ (строка символов) ~ args ~ @ body))

(def hisym" привет ") {{1} } (defn-with-str hisym [] (println "привет"))

Теперь у вас есть функция с именем "hisym"

(привет) -> java.lang.Exception: невозможно разрешить символ: привет в этот контекст (NO_SOURCE_FILE: 6) (hisym) -> печатает "привет"

Чтобы избежать этого, оцените строку имени функции в макросе

(defmacro defn-with-str [string args & body]
`(defn ~ (symbol (eval string)) ~ args ~ @ body))

7
ответ дан 1 December 2019 в 00:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: