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?
Répondre
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.
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). –
@ SK-logic: oui, mais encore une fois, vous n'auriez pas un vrai Lisp car sexprs serait impossible à imprimer. –
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"). –
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.
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.
Cela semble être la meilleure réponse à cette question. Tous les autres sont bien au-dessus de la tête d'un débutant. –
+1 pour expliquer d'une manière simple – cctan
- 1. Emacs Lisp: différence entre (fonction (lambda ...)) et (lambda ...)?
- 2. Fonction en Lisp
- 3. Quicksort en Lisp affiche l'erreur de fonction lambda
- 4. Renommer lambda dans Common Lisp
- 5. une simple fonction Lisp
- 6. récursion dans une fonction lambda
- 7. Comment append fonctionne en Common Lisp?
- 8. Lisp: Comment écrire un ordre supérieur Fonction
- 9. Comment implémenter lambda comme une fonction appelée "lambda" dans Clojure?
- 10. La fonction illégale appelle en commun Lisp
- 11. Comment faire la classe en utilisant la fonction (Common Lisp)
- 12. fonction lambda constante en python
- 13. Réorganiser les arguments de la fonction en Lisp
- 14. remplacer la fonction dans Lisp
- 15. Comment Expression Lambda fonctionne
- 16. Pointeurs en Lisp?
- 17. Traduire la fonction Q et P du Petit Schemer en Common Lisp?
- 18. Comment fonctionne cette fonction de filtrage de liste + lambda?
- 19. variables Fermer la fonction lambda
- 20. fonction Lisp nième ne fonctionne pas sur le contre-cellules
- 21. Comment créer une fonction temporaire dans Emacs Lisp
- 22. Comment connaître la fonction d'événement de lambda en elle-même
- 23. Comment émuler la fonction let de Lisp dans R?
- 24. Lisp: Interdire l'invocation double de la fonction récursive
- 25. Aide à la réduction d'une fonction Lisp
- 26. LISP fonction cdr
- 27. Comment prototyper une fonction lambda?
- 28. trié() avec la fonction lambda
- 29. Erreur de lisp commune: "devrait être l'expression de lambda"
- 30. Habillage d'une fonction quotée dans emacs-lisp
Probablement préférable de demander ou de recherche à http://cstheory.stackexchange.com/ – zaf
'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
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. –