2014-01-15 3 views
1

Я пытаюсь написать макрос, который я могу использовать для вызова функции в новом потоке, и напечатать имя функции, а также имя потока после его запуска.Проблемы с макросом clojure

До сих пор, что у меня есть:

 (defmacro start-threads [f] 
     '(let [t (Thread. 'f)] 
      (prn (str "running " 'f " on: " (.getName t))))) 

, который, когда я бегу:

(start-threads funcname) 

выходов: "работает на п: Thread-47". и я бы хотел, чтобы он выводил: «running funcname on: Thread-47. Когда я пытаюсь выполнить его без проверки, попробуйте оценить функцию. Я знаю, что я не запускал .start в этом разделе, но я должен быть в состоянии добавить что в дальнейшем. Я уверен, что макрос совершенно не нужен здесь, мне в основном интересно из любопытства, поскольку я только начинаю обдумывать, как работают макросы в clojure.

+0

Неточная одиночная кавычка. –

ответ

6

В принципе, вам нужен синтаксис -quote, а не нормальная цитата.

(defmacro start-threads [f] 
    `(let [t# (Thread. ~f)] 
    (prn (str "running " '~f " on: " (.getName t#))))) 

~f в синтаксисе кавычки интерполирует значение f, '~f котировки, которые ценят и t# делает автоматическую GENSYM так УАК Имя iable не будет конфликтовать с любыми окружающими именами.

Но, как вы правильно заметили, вам действительно не нужен макрос для этого. Это может быть легко:

(defn start-threads [f] 
    (let [t (Thread. f)] 
    (prn (str "running " f " on: " (.getName t))))) 
+0

Спасибо, это определенно полезно. Я предполагаю, что одна вещь, которую я хотел, вместо того, чтобы получать строковое представление функции, которая выглядит как [email protected], мне нужен фактический текст, который я ввожу в качестве аргумента макросу. поэтому (начальная нить записи) будет выводить «бегущий поток записи на: Thread-47». Очевидно, что это не так, мне просто интересно, как это можно сделать. –

+0

@SeanGeoffreyPietz: А, я вижу. Хорошо, я изменил код, чтобы работать таким образом. Единственное различие заключается в том, что вам просто нужно процитировать второй '~ f'. И это * - это то, что вам нужно для макроса, потому что аргументы будут вычисляться до выполнения функции, которую они передают для выполнения. – Chuck

Смежные вопросы