В своем ответе на вопрос a Code Review.SE question я предложил, чтобы ОП мог использовать записи для представления фигур в шахматах. Так как штучные записи будут все то же самое, за исключением имени, я полагал, что я мог бы генерировать их программен, например:Как я могу программно генерировать определения записей?
(map #(defrecord % [color])
["Rook" "Pawn" "Queen" "King" "Knight" "Bishop"])
Такого рода работал, но мои записи имена не штучные имен; они были случайными gensyms: вместо user.Rook
Я получил . Если бы я сделал (p1__910. :black)
, он действительно работал и создавал запись, но вы, вероятно, можете понять, почему я не был доволен этим.
Я также попытался следующие два варианта:
(map #(defrecord % [color])
['Rook 'Pawn 'Queen 'King 'Knight 'Bishop])
;; Same result as above.
(map #(defrecord (symbol %) [color])
["Rook" "Knight" "Pawn" "Queen" "King" "Bishop"])
;; CompilerException java.lang.ClassCastException: clojure.lang.PersistentList
;; cannot be cast to clojure.lang.Symbol, compiling:(NO_SOURCE_PATH:1:7)
Что случилось с моим подходом? Как я могу сгенерировать кучу идентичных записей из списка имен? Возможно ли это?
Моя неумелость с помощью макросов снова кусает меня. Спасибо за отличный ответ. – tsleyson