J'ai parcouru tous les messages et je pense que la plupart des avantages de lisp ont été cités (ou aperçus) :
- syntaxe simple ;
- puissance du fonctionnel ;
- interprété ;
- réflexif (un programme lisp manipule des listes et est lui-même un liste, donc manipulable).
Mais personne ne parle de la manipulation des symboles.
L'un des grands avantages du Lisp c'est qu'il permet de manipuler des symboles.
En fait, on voit peut-être moins facilement l'intérêt de nos jours avec tous les langages interprétés qui permettent de manipuler très facilement des chaînes de caractères mais un symbole, même si on peut le _réduire_ à une chaîne de caractères, ce n'est pas un simple nom, c'est une entité autonome qui a un sens.
Pour expliciter un peu dans une analogie pour programmeur, manipuler des symboles au lieu de manipuler des chaînes, c'est comme d'utiliser des constantes nommées : écrire ses calculs en utilisant PI plutôt que 3.1415..., c'est pour que l'intention du programme se retrouve dans le code.
La différence, c'est qu'un symbole n'a pas forcément de valeur dans le programme ('pi n'a pas besoin d'avoir une valeur pour être manipulé), il suffit qu'il en ait une pour le programmeur.
P.ex. je peux manipuler des formules mathématiques (les simplifier, les dériver, etc.) sans pour autant donner une valeur (numérique) aux variables et fonctions qu'elle contient. C'est d'ailleurs extrêmement facile en Lisp car les formules sont des arbres, qui sont aussi des listes : il suffit de transformer un peu les éléments (p.ex. (+ 0 x) devient x, (* 0 x) devient 0, ou, en dérivation, (^ x n) devient (* n (^ x (- n 1))), etc.).
(Remarquez que c'est aussi très facile en Prolog, qui manipule les arbres et les symboles comme personne.)
Ensuite, on peut donner une valeur aux symboles. On peut même, dans certains dialectes, en donner jusqu'à 9 : 'f peut correspondre à une variable, une fonction, des propriétés, etc.
C'est-à-dire qu'on peut utiliser le symbole dans différents contextes :
? (defun f (x y) (+ x y))
? (defvar f 12)
? f
12
? (f 1 3)
4
À noter qu'en Scheme, symbol-value et symbol-function sont confondues (ce qui peut être pratique mais aussi parfois embêtant).
Ces valeurs sont aussi accessibles par des fonctions :
On remarquera qu'un symbole à un nom (accessible par 'symbol-name) : le symbole n'est pas simplement un nom (comme le doigt n'est pas la lune ni la carte le territoire).
Un autre gros avantage du Lisp, surtout par rapport aux langages de son âge, c'est son mécanisme de gestion de la mémoire. Je sais, les pros du C diront qu'ils préfèrent faire leur malloc eux-mêmes. Mais lorsque l'on manipule des concepts de haut niveau (imaginez que vous programmez un psychologue logiciel que vous décidez d'appeler, euh, p.ex. « Elisa » ;o), si vous programmez en assembleur ou en C, vous passerez votre temps sur la gestion de la mémoire et des pointeurs.
On peut aussi dire « la gestion de la mémoire est un domaine très délicat, ce qui est une excellente raison pour ne pas la laisser à un programmeur ».
# Symboles et mémoire !
Posté par Sylvain Sauvage . En réponse au journal Lisp: pourquoi est-ce different ?. Évalué à 5.
- syntaxe simple ;
- puissance du fonctionnel ;
- interprété ;
- réflexif (un programme lisp manipule des listes et est lui-même un liste, donc manipulable).
Mais personne ne parle de la manipulation des symboles.
L'un des grands avantages du Lisp c'est qu'il permet de manipuler des symboles.
En fait, on voit peut-être moins facilement l'intérêt de nos jours avec tous les langages interprétés qui permettent de manipuler très facilement des chaînes de caractères mais un symbole, même si on peut le _réduire_ à une chaîne de caractères, ce n'est pas un simple nom, c'est une entité autonome qui a un sens.
Pour expliciter un peu dans une analogie pour programmeur, manipuler des symboles au lieu de manipuler des chaînes, c'est comme d'utiliser des constantes nommées : écrire ses calculs en utilisant PI plutôt que 3.1415..., c'est pour que l'intention du programme se retrouve dans le code.
La différence, c'est qu'un symbole n'a pas forcément de valeur dans le programme ('pi n'a pas besoin d'avoir une valeur pour être manipulé), il suffit qu'il en ait une pour le programmeur.
P.ex. je peux manipuler des formules mathématiques (les simplifier, les dériver, etc.) sans pour autant donner une valeur (numérique) aux variables et fonctions qu'elle contient. C'est d'ailleurs extrêmement facile en Lisp car les formules sont des arbres, qui sont aussi des listes : il suffit de transformer un peu les éléments (p.ex. (+ 0 x) devient x, (* 0 x) devient 0, ou, en dérivation, (^ x n) devient (* n (^ x (- n 1))), etc.).
(Remarquez que c'est aussi très facile en Prolog, qui manipule les arbres et les symboles comme personne.)
Ensuite, on peut donner une valeur aux symboles. On peut même, dans certains dialectes, en donner jusqu'à 9 : 'f peut correspondre à une variable, une fonction, des propriétés, etc.
C'est-à-dire qu'on peut utiliser le symbole dans différents contextes :
? (defun f (x y) (+ x y))
? (defvar f 12)
? f
12
? (f 1 3)
4
À noter qu'en Scheme, symbol-value et symbol-function sont confondues (ce qui peut être pratique mais aussi parfois embêtant).
Ces valeurs sont aussi accessibles par des fonctions :
(symbol-function 'f)
(symbol-value 'f)
(symbol-name 'f)
(symbol-plist 'f)
On remarquera qu'un symbole à un nom (accessible par 'symbol-name) : le symbole n'est pas simplement un nom (comme le doigt n'est pas la lune ni la carte le territoire).
Un autre gros avantage du Lisp, surtout par rapport aux langages de son âge, c'est son mécanisme de gestion de la mémoire. Je sais, les pros du C diront qu'ils préfèrent faire leur malloc eux-mêmes. Mais lorsque l'on manipule des concepts de haut niveau (imaginez que vous programmez un psychologue logiciel que vous décidez d'appeler, euh, p.ex. « Elisa » ;o), si vous programmez en assembleur ou en C, vous passerez votre temps sur la gestion de la mémoire et des pointeurs.
On peut aussi dire « la gestion de la mémoire est un domaine très délicat, ce qui est une excellente raison pour ne pas la laisser à un programmeur ».