Проблема макроса Clojure

Как получить инструменты сборки командной строки, установленные с Xcode 4.4 / Mac OS X v10.8 (Mountain Lion) или новее?

Для OS X 10.9 вы просто устанавливаете Xcode. Инструменты командной строки в комплекте с Xcode. Из Технической ноты TN2339, Сборка из командной строки с часто задаваемыми вопросами Xcode :

Загрузка инструментов командной строки недоступна в Xcode для OS X 10.9. Как я могу установить их на моем компьютере?

В OS X 10.9 панель «Загрузки» в настройках XCode не поддерживает загрузку инструментов командной строки. Используйте любой из следующих методов для установки инструментов командной строки в вашей системе:

Если XCode установлен на вашем компьютере, тогда нет необходимости его устанавливать. Xcode поставляется в комплекте со всеми вашими инструментами командной строки. OS X 10.9 включает в себя исполняемые файлы оболочки или оболочки. Эти прокладки, установленные в / usr / bin, могут сопоставить любой инструмент, включенный в / usr / bin, с соответствующим инструментом внутри Xcode. xcrun - одна из таких оболочек, которая позволяет вам найти или запустить любой инструмент внутри XCode из командной строки. Используйте это, чтобы вызвать любой инструмент в XCode из командной строки. ...

7
задан Nathaniel Flath 6 July 2009 в 23:27
поделиться

3 ответа

Набор ссылок, опубликованный в качестве комментария к вашему вопросу, содержит ответ (виноват способ обработки аргументов анонимных функций); следующее, используя аргумент gensym, должно работать:

(defmacro prototype [structure obj]
  `(apply struct ~structure (map (fn [x#] (~obj x#)) (keys ~obj))))
8
ответ дан 6 December 2019 в 19:41
поделиться

Вот фиксированная версия:

(defmacro prototype [structure obj]
  `(apply struct ~structure (map ~obj (keys ~obj))))

Почему это должен быть макрос? Также работает функция:

(defn prototype [structure obj]
  (apply struct structure (map obj (keys obj))))

Почему вы хотите скопировать структуру? Структуры неизменяемы, поэтому их копирование бесполезно. Эта функция делает то же самое, что и приведенная выше:

(defn prototype [structure obj] obj)

Если вы хотите создать новую структуру с дополнительными ключами и значениями, используйте assoc .

3
ответ дан 6 December 2019 в 19:41
поделиться

Вы не должны использовать # () внутри макроса.

user> (macroexpand-1 `(foo #(bar %) baz))
(user/foo (fn* [user/p1__2047] (user/bar user/p1__2047)) user/baz)

Не то, чтобы форма fn * содержала символ пространства имен в его список параметров. Это ошибка, которую вы получаете. Вам следует избегать такого рода специального синтаксиса чтения в макросах и вместо этого использовать длинные формы.

2
ответ дан 6 December 2019 в 19:41
поделиться
Другие вопросы по тегам:

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