2010-09-15 1 views
11

Quand je requiers les bibliothèques des ns forme que je reçois:Pourquoi ne nécessite dans les ns forment un comportement différent de la fonction require

test> (ns test (:require '(clojure.contrib [logging :as log] [sql :as sql]))) 
lib names inside prefix lists must not contain periods 
[Thrown class java.lang.Exception] 

Lorsque j'utilise la fonction require fonctionne comme prévu.

test> (require '(clojure.contrib [logging :as log] [sql :as sql])) 
nil 

La documentation ns se réfère à la documentation de la fonction require mais comme ils se comportent différemment cela est un peu confus.

Répondre

16

Le formulaire ns est une macro, il n'est donc pas nécessaire d'utiliser 'pour citer le seq fourni.

Un exemple des Clojure docs:

(ns foo.bar 
    (:refer-clojure :exclude [ancestors printf]) 
    (:require (clojure.contrib sql sql.tests)) 
    (:use (my.lib this that)) 
    (:import (java.util Date Timer Random) 
     (java.sql Connection Statement))) 
+1

Aïe, mordue à nouveau par cette 'fonction' ... Merci! –

+1

Oui, ce n'est pas très cohérent. La ligne directrice générale, cependant, est qu'il est toujours préférable d'utiliser ns au lieu d'importer, require, etc. directement. Vous devriez probablement penser aux formes individuelles comme des primitives de bas niveau, et utiliser ns exclusivement. – levand

+5

Ce qui me surprend, c'est que les macros ne supportent pas la forme citée pour la cohérence. Je dois creuser dans ce un soir pour comprendre pourquoi c'est. –

Questions connexes