7
votes

Problème macro de clojure

J'essaie de créer une fonction pour créer une nouvelle base avec une autre structure comme base, et j'ai essayé de créer une macro qui créerait une nouvelle structure avec les mêmes champs que l'ancien. La macro j'ai ce que je pensais devrait em> le cas échéant est ci-dessous, mais cela donne l'erreur suivante: xxx pré>

macro: p> xxx

Exemple d'utilisation: P>

{:data 3 :left nil :right nil}


2 commentaires

Je suis nouveau à Clojure mais j'ai trouvé ce lien: OSDIR. com / ml / java.clojure.user / 2008-03 / msg00108.html


Pourriez-vous ajouter la sortie souhaitée à l'exemple d'utilisation


3 Réponses :


3
votes

Voici une version fixe:

(defn prototype [structure obj] obj)


0 commentaires

8
votes

Le lien Seth posté comme un commentaire à votre question contient la réponse (le coupable est la manière dont les arguments aux fonctions anonymes sont traités); Ce qui suit, en utilisant un argument de gensym, devrait fonctionner:

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


0 commentaires

2
votes

Vous ne devriez pas utiliser # () à l'intérieur d'une macro. xxx

pas que le formulaire fn * a un espace de noms- Symbole qualifié dans sa liste de paramètres. C'est l'erreur que vous obtenez. Vous devez éviter ce type de syntaxe spéciale de lecteur dans les macros et utiliser les formes longues à la place.


0 commentaires