Clojure : chargement des dépendances à l'REPL
J'ai appris récemment (grâce à technomancy) qui, à la REPL ---
D'échec:
user=> (:require [clojure.set :as set])
java.lang.ClassNotFoundException: clojure.set (NO_SOURCE_FILE:24)
Alors que cela réussit :
user=> (require '[clojure.set :as cs])
nil
au chargement de la clojure.ensemble de la classe.
Contexte: L'ancienne ligne a été copié à partir d'un espace de noms de fichier source.
Ma principale question est : Quel est le changement que nous avons fait, par le remplacement de l' : et les personnages, ce qui permet maintenant pour le succès de la dernière commande ?
Ma 2ème question est , en général - quelles sont les lignes directrices pour faire les choses à la REPL --- par rapport à faire les choses à la normale clojure fichiers source ? Supposons ici que nous pouvons nous charger de notre repl à partir de la racine d'un LEININGEN projet, donc au moins les pots seront disponibles sur le disque dans les dépendances sous-répertoire.
- Je suppose que ce vraiment pose la question de "pourquoi a besoin d'un mot-clé dans un normal clj fichier --- mais une fonction standard à la REPL".
- Je pense que la deuxième partie est un peu général et doit être supprimé ou divisé en totalement un poste distinct.
Vous devez vous connecter pour publier un commentaire.
Je vais aller de haut niveau vers le bas de votre problème particulier:
Comment Clojure (ou LISPs) Travaillent Généralement
REPLs, ou Read-Eval-Print, les Boucles sont la base de la façon dont LISPs sont conçus:
Ainsi, lorsque vous entrez du texte dans un REPL, il passe en revue chacune de ces étapes de traitement de votre entrée et de retour de la sortie de votre terminal.
Lecteur Formes
Première certains, clojure lecteur de formes. Ce sera extrêmement bref, je vous encourage à lire ou de regarder (partie 1, partie 2) à ce sujet.
Un symbole en clojure est de la forme que peut représenter une valeur particulière (comme une variable). Les symboles eux-mêmes peuvent se passer autour de lui comme des données. Ils sont similaires à des pointeurs en c, juste sans la gestion de la mémoire des choses.
Un symbole avec un colon en face d'elle est un mot-clé. Les mots clés sont comme des symboles à l'exception qu'un mot-clé de la valeur sont toujours eux-mêmes semblables à des chaînes ou des nombres. Ils sont identiques à Ruby symboles (qui sont aussi préfixé avec des virgules).
Un devis en face d'un formulaire raconte l'évaluateur de quitter la structure de données que-est:
Bien que citant peut s'appliquer à plusieurs listes, il est principalement utilisé pour les listes parce que clojure de l'évaluateur normalement exécuter des listes comme une fonction-comme invocation. À l'aide de la
'
est un raccourci pour la citation de macro:Citant fondamentalement spécifie la structure de données de retour et pas de code à exécuter. Si vous pouvez citer des symboles qui se réfère au symbole.
Et de cotation est récursive. Ainsi toutes les données à l'intérieur sont indiqués aussi:
Pour obtenir le comportement de
(foo bar)
sans le citer, vous pouvez eval c':Il y a beaucoup plus à offrir, mais qui est hors de ce champ d'application.
Nécessitant
Que pour exiger des déclarations, je suis en supposant que vous avez trouvé dans l'ancienne forme de:
ns
est un macro qui permettront de transformer l' :exiger de l'expression dans la dernière forme que vous avez décrit:Avec quelques namespacing travail. Les bases sont décrites lors de la demande de docs de ns dans le REPL.
REPL utilisation
En général, ne pas utiliser de
ns
dans le REPL, et il suffit d'utiliser larequire
etuse
fonctions. Mais dans les fichiers, utilisez lans
macro pour faire d'autres choses.La différence est que
require
est une fonction utilisée pour l'importation de code, alors que:require
est un mot-clé.Rappelez-vous ce qui se passe lorsque vous utilisez un mot-clé comme une fonction:
il semble lui-même dans la carte. Ainsi, lorsque vous passez
[clojure.set :as set]
à un mot-clé, c'est d'essayer d'évaluer que pour un vecteur, et échoue parce qu'il ne sait pas ce queclojure.set
est. Le Clojure docs dire:Vous pouvez avoir été confondu par le
ns
macro: