2012-01-03 3 views
3

J'ai lu dans le livre Land of Lisp que la fonction lambda est la seule fonction intégrée. Cependant, je ne comprends pas vraiment comment cela est possible parce que je pensais que vous auriez au moins besoin d'une commande pour l'addition, une pour comparer les nombres, et une pour déplacer les données d'une variable à l'autre. Je me demandais si quelqu'un pouvait m'expliquer à quel point ça le faisait. Je ne suis pas un mathématicien donc si c'est possible, pourriez-vous l'expliquer sans beaucoup de calculs complexes?Comment fonctionne la fonction lambda en Lisp?

+0

Probablement préférable de demander ou de recherche à http://cstheory.stackexchange.com/ – zaf

+5

'J'ai lu dans le livre "land of lisp" que la fonction lambda est la seule fonction intégrée.' Pouvez-vous citer toute la phrase (ou le passage) que vous pensez avoir dit? Cette déclaration me semble assez étrange. 'lambda' n'est pas une fonction, c'est une forme spéciale. Et il y a certainement des fonctions intégrées dans chaque Lisp, qui ne pouvaient pas être définies par l'utilisateur si elles n'existaient pas (comme par exemple la fonction +, comme vous l'avez mentionné). Ce que je pense que le livre pourrait avoir dit que lambda est la seule façon de ** définir ** les fonctions qui sont intégrées dans le langage (par exemple 'defun' est juste une macro construite au-dessus de lambda). – sepp2k

+1

Lambda calculus est un système complet de Turing, donc oui, vous pouvez tout faire avec. Mais pas en Lisp avec sa sémantique d'évaluation avide - là vous aurez besoin d'au moins un 'if' ou quelque chose de similaire. –

Répondre

3

Vous confondez certaines choses ici. lambda n'est pas une fonction. C'est une construction construite dans le langage Lisp.

Tout Lisp pratique aura beaucoup de fonctions intégrées; il faut au moins car et cdr pour séparer les listes et certaines fonctions arithmétiques primitives ne peuvent pas être définies en termes d'autres fonctions. (*) De même, les parties "non-fonctionnelles" de Lisp telles que setf ont besoin de certaines primitives.

[*] Vous pouvez faire Church arithmetic en Lisp, mais vous ne pouvez pas jolie imprimer les résultats en raison du système de type Lisp mais si vous pouvez correctement imprimer le résultat dépend de la variante Lisp.

+2

Si vous utilisez l'encodage de l'église pour tout, vous n'aurez pas besoin de voiture et de cdr (c'est-à-dire que vous pouvez utiliser des paires d'églises à la place). –

+0

@ SK-logic: oui, mais encore une fois, vous n'auriez pas un vrai Lisp car sexprs serait impossible à imprimer. –

+4

vous pouvez définir votre propre pretty-printer (et votre propre analyseur, pour produire des listes codées par Church au lieu des listes Lisp "natives"). –

5

C'est la différence entre la théorie et un vrai langage de programmation. Lisp a pris des idées de Lambda Calculus, mais ne l'implémente pas. Le calcul lambda décrit un système de calcul utilisant des fonctions. Il est utile de comprendre Lambda Calculus, mais vous ne pourrez pas programmer en Lambda Calculus pur lorsque vous utilisez Lisp. En tant que langage de programmation, Lisp possède toutes sortes de types de données et d'opérations pour ceux-ci (nombres, chaînes, caractères, contre cellules, symboles, fonctions, ...).

Comparez cela aux machines de Turing et quelque chose comme le langage de programmation C.

5

Qu'est-ce que « Land of Lisp » dit ici n'est pas que lambda est la seule Lisp primitive, mais plutôt que (selon le calcul lambda de Alonzo Church , dont Lisp a des fondements théoriques), on pourrait implémenter le reste de Lisp avec lambda, car le lambda-calcul équivaut à une machine universelle de Turing.

Pour la plupart des applications pratiques, lambda est utilisé pour définir des fonctions anonymes.

+1

Cela semble être la meilleure réponse à cette question. Tous les autres sont bien au-dessus de la tête d'un débutant. –

+2

+1 pour expliquer d'une manière simple – cctan

Questions connexes