Est-il rien de semblable à l'instruction de retour de C en Lisp?

Je veux mettre en œuvre une condition de base dans une fonction récursive écrit en Lisp, mais je ne suis pas capable de faire cela, car il n'y a pas de return dans Lisp.

Mon code Lisp est basé sur ce code C

if (n==0) return;

Comment puis-je mettre en œuvre cette en Lisp?

Lisp est souvent utilisé comme un langage de programmation fonctionnel. Cela signifie sorties à terme/stdout sont considérés comme des "effets secondaires" et un peu (sans donc une forte connotation négative) impur. Bien sûr, n'importe quelle fonction en Common Lisp permettra d'évaluer le bas pour que la valeur de ses finalmost forme.
Donc pour quelque chose comme abandonner tout cela si n est égal à 0 dans une fonction que nous appellerons #'foo vous auriez probablement utiliser un conditionnel dans la plupart des cas, ce serait probablement le #'cond fonction mais ici, c'est une simple mise en œuvre à l'aide de #'quand, souvent intégré dans une macro. (when (= n 0) (return-from foo nil)) Ci-dessus si formulaire, le nul peut être remplacé par une forme plus compliquée, mais si c'est nécessaire, vous aurez probablement envie de construire une mise en œuvre de (cond) ou (case) etcetera.
lisp n'est plus fonctionnel que le perl, à l'exception de la plus simple de le citer. certains problèmes ne peuvent être résolus dans un style fonctionnel sans la mettre dans une machine d'état qui effectivement fait la même chose que du code impératif sauf les transformations de l'environnement sont fait par copie à chaque opération. un de ces problèmes est la réduction partielle, où vous voulez réduire une liste d'étapes lors de la transformation de l'environnement, mais arrêter de réduire lorsqu'une certaine condition est remplie; "impératif" code efficacement les résumés de la complexité de ce, alors que les "pure fonctionnelle" du fait qu'il est impossible.
par exemple, une pure approche fonctionnelle des luttes avec l'expression find the index of the string "hi" in my array xs, parce que réduire devez aller à travers l'ensemble du tableau, même après qu'il trouve, et le filtre d'aller à travers l'ensemble de la baie et de ne pas même savoir ce que la première est qu'il est destiné à être un non-ordonnée de l'opération. Donc, il n'y a aucun moyen d'exprimer ce problème correctement sans la mettre dans une machine d'état/stream/"monade", et une telle approche est isomorphe à l'impératif d'approche.

OriginalL'auteur Akash Babu | 2014-10-09