48 votes

Puis-je utiliser Common Lisp pour SICP ou Scheme est-il la seule option?

Aussi, même si je peux utiliser Common Lisp, devrais-je? Le régime est-il meilleur?

15voto

Rainer Joswig Points 62532

Vous pouvez utiliser Common Lisp pour l'apprentissage avec SICP sans trop de problèmes. Le Schéma de sous-ensemble qui est utilisé dans le livre n'est pas très sophistiqué. SICP ne pas utiliser les macros et il n'utilise pas de suites. Il y a un RETARD et de la FORCE, qui peut être écrit en Common Lisp en quelques lignes.

Aussi pour un débutant à l'aide de (function foo) et (funcall foo 1 2 3) est en fait mieux (à mon humble avis !), parce que le code est plus clair lors de l'apprentissage de la programmation fonctionnelle des pièces. Vous pouvez voir où les variables et les lambda fonctions sont appelés/passé.

Il y a une seule grande zone où l'aide de Common Lisp a un inconvénient: la queue d'appel d'optimisation (TCO). Common Lisp ne prend pas en charge que dans son standard.

Il existe trois façons de vivre avec ça:

  1. Espérons que la pile ne pas souffler. MAUVAIS.
  2. L'utilisation d'un Common Lisp mise en œuvre qui prend en charge le coût de possession. Il y a quelques.
  3. La réécriture de la fonctionnelle de la boucle (et d'autres constructions similaires) dans les boucles (et d'autres constructions similaires) à l'aide de DOTIMES, N', BOUCLE, ...

Personnellement, je recommanderais 3., mais 2. peut fonctionner aussi.

Common Lisp est un excellent et facile à utiliser des environnements de développement (LispWorks, Allegro CL, Clozure CL sur un Mac, MCL, ...) et quelques-uns qui ne sont pas que facile à utiliser, mais puissant, trop (Emacs/BOUE, ...).

Parfois, il pourrait également être utile d'écrire un ou deux macros afin de rendre le code un peu plus comme Régime. Par exemple, vous pourriez avoir une définition de macro en Common Lisp. Mais ce n'est pas strictement nécessaire, et je ne le recommanderais pas, à moins qu'il doit gagner du temps dans la traduction de code.

Pour les utilisateurs plus avancés, il y a un vieux Schéma de mise en œuvre (appelé Pseudo Scheme), qui doit s'exécuter la plupart du code de SICP.

Ma recommandation: si vous voulez aller le mile supplémentaire et l'utilisation Common Lisp, de le faire.

11voto

Nathan Sanders Points 10641

Ne vous connaissez déjà certains Common Lisp? Je suppose que c'est ce que vous entendez par 'Lisp'. Dans ce cas, vous pourriez utiliser à la place de Régime. Si vous ne connaissez pas, et que vous travaillez à travers SICP uniquement pour l'expérience d'apprentissage, alors probablement que vous êtes mieux avec Régime. Il a beaucoup plus de soutien pour les nouveaux apprenants, et vous n'aurez pas à traduire à partir du Régime de Common Lisp.

Il y a des différences; en particulier, SICP est très fonctionnel style est wordier en Common Lisp parce que vous avez citer fonctions lors de leur passage autour et à l'utiliser funcall pour appeler une fonction lié à une variable.

Cependant, si vous souhaitez utiliser Common Lisp, vous pouvez essayer d'utiliser Eli Bendersky de Common Lisp traductions de la SICP code.

2voto

finnw Points 24592

Edit: le commentaire de Nathan Sanders est correct. Cela fait clairement un moment que je n'ai pas lu le livre pour la dernière fois, mais je viens de vérifier et il n'utilise pas call/cc directement. J'ai voté pour la réponse de Nathan.


Quoi que vous utilisiez, vous devez implémenter des continuations, que SICP utilise beaucoup. Pas même tous les interprètes Scheme les implémentent, et je ne connais aucun Common Lisp qui le fasse.

1voto

AraK Points 38702

Ils sont semblables mais pas les mêmes.

Je crois que si vous y allez avec Scheme, ce serait plus facile.

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