2

J'implémente actuellement une langue différente (Shen) dans Clojure../ dans Clojure (symbole qualifié?)

Shen a un symbole "./" mais dans Clojure, il est interprété avant l'évaluation et entraîne donc une erreur. Je n'ai pas besoin de "./" dans la macro qui compile cette fonction en code Clojure.

Y at-il un moyen d'ignorer cela? Je pense qu'il est interprété comme un symbole qualifié mais sans nom, puisque le remplacer par un/ou xyz/entraîne les mêmes messages d'erreur.

Ma macro actuelle est aussi simple que

(defmacro kl/trap-error [x [y z r]] `(try ~x (catch Exception '~z ~r))) 

Mais quand je l'appelle avec le code Shen arrive ceci:

kl=> (trap-error (/ 1 0) (./ E (error-to-string E) 
RuntimeException Invalid token: ./ clojure.lang.Util.runtimeException (Util.java:156) 
CompilerException java.lang.RuntimeException: Unable to resolve symbol: E in this context, compiling:(NO_SOURCE_PATH:0) 
CompilerException java.lang.RuntimeException: Unable to resolve symbol: E in this context, compiling:(NO_SOURCE_PATH:89) 

J'espère que quelqu'un peut me aider.

Merci d'avance. Ceci n'est pas possible sans modifier le lecteur Clojure (un privilège qui n'est pas donné aux programmeurs Clojure)

+1

En CL, vous pouvez utiliser | ./ |, je ne sais pas si cela fonctionne pour Clojure. – Daimrod

+1

Autant que je sache, vous auriez besoin d'un lecteur personnalisé pour le faire dans Clojure, mais je ne suis pas sûr. – danlei

+0

@danlei: Mais pour autant que je sache, Clojure n'a pas de moyen standard pour définir une macro de lecteur, vous devez [pirater un peu] (http://briancarper.net/blog/449/clojure-reader-macros) et ce n'est pas vraiment apprécié. – Daimrod

Répondre

2

Ceci n'est pas possible sans modifier le lecteur Clojure. Votre déclaration "Shen a un symbole ./ mais dans Clojure ceci est interprété avant l'évaluation et entraîne donc une erreur" est incorrect, cependant - aucune interprétation ou évaluation ne se passe du tout, parce que le lecteur voit ces caractères et ne peut même pas comprendre quel type de données ils devraient être.

  • Sont-ils une liste? Non, pas de parens.
  • Sont-ils une chaîne? Non, pas de citations.
  • Sont-ils un symbole? Non, il y aurait un espace de noms mais pas de nom.
  • ... beaucoup d'autres cas comme celui-ci ...
  • J'abandonne, ce n'est pas une structure de données qui représente le code Clojure valide.
+0

Écrire du code Shen dans la REPL de Clojure n'est donc pas possible, n'est-ce pas? Ne lire que les fichiers et remplacer "./" avant d'utiliser par ex. read-string ... –

+0

Bien. clojure.main/repl vous permet de spécifier une fonction qui sera utilisée pour la lecture à la place du built-in. Donc, pour le cas spécifique de l'écrire sur le repl, vous pouvez probablement faire très bien avec un peu de travail. Mais l'exigence de fichiers n'a pas de sens, donc je ne pense pas qu'il y ait quelque chose que vous puissiez faire dans le cas général. – amalloy

+0

Merci. Je pourrais essayer d'écrire un "Shen REPL" qui peut lire ceci. Pour l'instant je vais avec seulement lire les fichiers Shen et remplacer le /. par lambda avant l'évaluation. –

Questions connexes