39 votes

let vs def à clojure

Je veux créer une instance locale d'une classe Java Scanner dans un programme clojure. Pourquoi cela ne fonctionne-t-il pas:

 ;gives me:  count not supported on this type: Symbol 
(let s (new Scanner "a b c"))
 

mais cela me permettra de créer une instance globale comme celle-ci:

 (def s (new Scanner "a b c"))
 

J'avais l'impression que la seule différence était la portée, mais apparemment pas. Quelle est la difference entre let et def?

57voto

Rayne Points 14518

Le problème, c'est que votre utilisation de l' let est faux.

Laissez fonctionne comme ceci:

(let [identifier (expr)])

Donc votre exemple devrait être quelque chose comme ceci:

(let [s (Scanner. "a b c")]
  (exprs))

Vous ne pouvez utiliser le lexique des liaisons faite avec de la laisser dans le champ d'application de la let (l'ouverture et la fermeture des parenthèses). Laissez juste crée un ensemble de liaisons lexicales. J'utilise def pour la fabrication mondiale de liaison et permet pour la liaison quelque chose que je veux seulement dans le champ d'application de la laisser car cela permet de garder les choses propres. Ils tous les deux ont leurs usages.

NOTE: (la Classe). est la même que (nouvelle Classe), c'est juste du sucre syntaxique.

34voto

Svante Points 24355

LET n'est pas "créer une liaison lexicale dans la portée actuelle", mais "créer une nouvelle portée lexicale avec les liaisons suivantes".

(laissez [s (foo que ce soit)]
  ;; s est lié ici
  )
;; mais pas ici
(def s (foo que ce soit))
;; s est lié ici

14voto

Marko Points 13736

Simplifié: def est pour les constantes globales, let pour les variables locales.

12voto

ayrnieu Points 1436

Syntaxe correcte:

 (let [s (Scanner. "a b c")] ...)
 

4voto

MarkusQ Points 15612

Leur syntaxe est différente, même si les significations sont liées.

let prend une liste de liaisons (paires nom-valeur) suivie d'expressions à évaluer dans le contexte de ces liaisons.

def prend juste une liaison, pas une liste, et l'ajoute au contexte global.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X