2017-10-03 1 views
-2
(defn foo [n] 
     (if (== 1 n) 
     true 
     ) 
     false 
    ) 

    (if (true? (foo 1)) 
     (println "true") 
     ) 
    (if (false? (foo 1)) 
     (println "false") 
    ) 

Cela renvoie toujours faux, je suppose que dans clojure il ne retourne que la dernière chose que j'écris dans la fonction. Comment puis-je casser une boucle et retourner quelque chose quand la condition if est remplie?Clojure: la fonction ne retournera pas à droite

+0

Déplacer paren après true à false: '(if (== 1 n) true false)'. Nous vous recommandons également d'obtenir un éditeur avec un support de mise en forme, c'est vraiment difficile à lire (ce qui peut expliquer pourquoi vous n'avez pas remarqué le problème vous-même). –

+0

Regardez dans IntelliJ + Cursive. Comme mentionné ci-dessus, il s'agit d'un problème de contreventement, et tout formatage de code aurait rendu cela évident. En outre, il n'y a pas de boucles ici. – Carcigenicate

+0

Notez également que foo est équivalent à '(partial = 1)'. –

Répondre

2

L'opérateur if a le format suivant:

(if conditional-expression return-for-true return-for-false) 

Votre code est écrit comme ceci:

(if conditional-expression return-for-true) return-for-false 

Notez les paren mal placés. Notez également que sauf si l'expression conditionnelle est un appel de fonction, aucune parens n'est nécessaire.

Votre fonction foo, telle qu'écrite, évalue deux expressions (if ...) et false et renvoie de façon prévisible la dernière expression évaluée, qui est juste le littéral false. Pour un exemple plus courte de ce qui se passe, considérez ceci:

(defn foo [n] (+ 3 n) 4) 

L'appel de cette fonction retourne toujours 4: l'expression d'addition est soit évaluée et non utilisé ou optimisé loin par le compilateur.

+0

Maintenant, je l'obtiens merci! – iyazici

+0

Vous avez des parenthèses externes autour de '(expression conditionnelle)'. Tout comme avec les branches 'then' et' else', il n'y a pas de parens décoratifs pour la condition. – amalloy

+0

@amalloy a fait un montage de clarification. L'écriture de cette façon parce que dans la question originale l'expression conditionnelle était un appel de fonction. –