63 votes

Lisp et Erlang Atomes, de Rubis et d'un Système de Symboles. Quelle utilité sont-ils?

Quelle est l'utilité de la caractéristique d'avoir un atome de type de données dans un langage de programmation?

Quelques langages de programmation, le concept de l'atome ou symbole pour représenter une constante de toutes sortes. Il y a quelques différences entre les langues que j'ai rencontré (Lisp, de Rubis et d'Erlang), mais il me semble que le concept général est le même. Je suis intéressé par la programmation de langue de conception, et je me demandais quelle est la valeur d'avoir un type d'atome fournir dans la vraie vie. D'autres langages tels que Python, Java, C# semblent faire très bien sans elle.

Je n'ai pas de réelle expérience de Lisp ou Ruby (je sais que les syntaxes, mais je n'ai pas utilisé soit dans un projet réel). J'ai utilisé Erlang assez pour être utilisé à la notion de là.

54voto

Les atomes sont des littéraux, des constantes à leur propre nom pour la valeur. Ce que vous voyez est ce qui obtenez vous et ne vous attendez pas à plus. L'atome chat signifie "chat" et c'est tout. Vous ne pouvez pas jouer avec elle, vous ne pouvez pas le changer, vous ne pouvez pas casser en morceaux; c'est le chat. Traiter avec elle.

J'ai comparé les atomes à des constantes d'avoir leur nom de leurs valeurs. Vous avez travaillé avec le code utilisé constantes avant: par exemple, disons que j'ai des valeurs pour les couleurs des yeux: BLUE -> 1, BROWN -> 2, GREEN -> 3, OTHER -> 4. Vous devez faire correspondre le nom de la constante de certains sous-jacent de la valeur. Atomes de vous permettre oublier les valeurs sous-jacentes: mes yeux de couleurs peut être simplement 'bleu', 'marron', 'vert' et 'les autres'. Ces couleurs peuvent être utilisées n'importe où dans n'importe quel morceau de code: les valeurs sous-jacentes ne sera jamais l'affrontement et il est impossible pour une telle constante pour être indéfini!

prises de http://learnyousomeerlang.com/starting-out-for-real#atoms

Cela étant dit, les atomes finissent par être un meilleur ajustement sémantique pour la description des données dans votre code dans des lieux autres langues seraient forcés d'utiliser des chaînes, les énumérations ou définit. Ils sont plus sûrs et plus conviviale à utiliser pour les mêmes résultats.

38voto

Vijay Mathew Points 17155

Un court exemple qui montre comment la capacité à manipuler des symboles conduit à nettoyeur de code: (le Code est dans le Schéma, un dialecte de Lisp).

(define men '(socrates plato aristotle))

(define (man? x) 
    (contains? men x))

(define (mortal? x) 
    (man? x))

;; test

> (mortal? 'socrates)
=> #t

Vous pouvez écrire ce programme à l'aide de chaînes de caractères ou des constantes entières. Mais la version symbolique a certains avantages. Un symbole est unique dans le système. Cela rend la comparaison de deux symboles aussi vite que la comparaison de deux pointeurs. C'est évidemment plus rapide que la comparaison de deux chaînes de caractères. À l'aide de constantes entières permet aux gens d'écrire du code sans signification comme:

(define SOCRATES 1)
;; ...

(mortal? SOCRATES)
(mortal? -1) ;; ??

Probablement une réponse détaillée à cette question peut être trouvée dans le livre Common Lisp: Une Douce Introduction au Calcul Symbolique.

14voto

Les atomes (en Erlang ou Prolog, etc.) ou des symboles (en Lisp ou Ruby, etc.)—à partir d'ici que les atomes sont très utiles lorsque vous avez une valeur sémantique qui n'est pas naturel sous-jacent "natif" de la représentation. Ils prennent de l'espace de style C énumérations comme ceci:

enum days { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY }

La différence est que les atomes n'avez généralement pas à être déclarés et ils n'ont PAS de représentation sous-jacente à s'inquiéter. L'atome monday en Erlang ou Prologue a la valeur de "l'atome monday" et rien de plus ou de moins.

S'il est vrai que vous pourriez obtenir beaucoup de la même utilisation en dehors de la chaîne de types comme vous le feriez à partir des atomes, il y a certains avantages à ce dernier. D'abord, parce que les atomes sont garantis d'être unique (derrière les coulisses de leurs représentations de chaîne sont convertis en une forme de facilement-testé ID) il est beaucoup plus rapide de les comparer entre eux que de comparer l'équivalent des chaînes de caractères. Deuxièmement, ils sont indissociables. L'atome monday ne peut pas être testé pour voir si elle se termine en day par exemple. Il est un pur, indivisible unité sémantique. Vous avez moins conceptuel surcharge que vous le feriez dans une représentation de chaîne en d'autres termes.

Vous pouvez également obtenir le même avantage avec style C énumérations. La comparaison de la vitesse en particulier, si quoi que ce soit, plus rapide. Mais... c'est un entier. Et vous pouvez faire des choses bizarres comme l'ont SATURDAY et SUNDAY traduire à la même valeur:

enum days { SATURDAY, SUNDAY = 0, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY }

Cela signifie que vous ne pouvez pas faire confiance différents "symboles" (énumérations) à des choses différentes, et fait donc de raisonner sur le code beaucoup plus difficile. Aussi, l'envoi des types énumérés par l'intermédiaire d'un fil de protocole est problématique car il n'y a aucun moyen de distinguer entre eux et régulière des entiers. Les atomes n'ont pas ce problème. Un atome n'est pas un entier et ne sera pas comme dans les coulisses.

13voto

Greg Dan Points 2667

En tant que programmeur en C, j'ai eu un problème avec la compréhension de ce que Ruby symboles sont vraiment. J'ai été éclairé après, j'ai vu comment les symboles sont mis en œuvre dans le code source.

À l'intérieur du code Ruby, il y a un mondial de la table de hachage, les chaînes de mappés à des entiers. Tous les rubis symboles y sont conservées. Interpréteur Ruby, cours de code source analyser la scène, utilise cette table de hachage pour convertir tous les symboles de nombres entiers. Ensuite, en interne, tous les symboles sont traitées comme des nombres entiers. Cela signifie qu'un symbole n'occupe que 4 octets de la mémoire et de toutes les comparaisons sont très rapides.

Donc, fondamentalement, vous pouvez traiter Ruby symboles comme des chaînes de caractères qui sont mis en œuvre dans une manière très intelligente. Ils ressemblent à des cordes, mais presque comme des entiers.

Lorsqu'une nouvelle chaîne est créé, puis en Ruby, une nouvelle structure C est alloué à garder cet objet. Pour les deux Rubis chaînes, il y a deux pointeurs vers deux différents emplacements de mémoire (qui peut contenir la même chaîne). Toutefois, un symbole est immédiatement convertie en C le type int. Par conséquent, il n'existe aucun moyen de distinguer les deux symboles comme deux objets Ruby. C'est un effet de bord de la mise en œuvre. Il suffit de garder cela à l'esprit lors du codage, et c'est tout.

12voto

Rainer Joswig Points 62532

En Lisp symbole et atom sont deux différents et sans rapport avec les concepts.

Généralement en Lisp un ATOME n'est pas un type de données spécifique. C'est un court-main pour ne PAS les INCONVÉNIENTS.

(defun atom (item)
  (not (consp item)))

Aussi le type d'ATOME est le même que le type (PAS CONS).

Tout ce qui n'est pas une contre cellule est un atome en Common Lisp.

Un SYMBOLE est un type de données spécifique.

Un symbole est un objet avec un nom et une identité. Un symbole peut être internés dans un package. Un symbole peut avoir une valeur, une fonction et une liste de propriétés.

CL-USER 49 > (describe 'FOO)

FOO is a SYMBOL
NAME          "FOO"
VALUE         #<unbound value>
FUNCTION      #<unbound function>
PLIST         NIL
PACKAGE       #<The COMMON-LISP-USER package, 91/256 internal, 0/4 external>

En Lisp code source les identificateurs de variables, fonctions, classes et ainsi de suite sont rédigés par des symboles. Si un Lisp s-expression est lu par le lecteur, il ne de créer de nouveaux symboles s'ils ne sont pas connus (disponible dans le paquet courant) ou réutilise un symbole existant (si elle est disponible dans le package courant. Si le Lisp lecteur lit une liste comme

(snow snow)

il crée ensuite une liste de deux cons cellules. La VOITURE de chaque inconvénients de la cellule de point à la même symbole de neige. Il n'y a qu'un seul symbole pour elle dans le Lisp de la mémoire.

Notez également que le fichier plist (la liste de propriété) d'un symbole peut enregistrer d'autres méta-informations pour un symbole. Ce pourrait être l'auteur, un emplacement de la source, etc. L'utilisateur peut également utiliser cette fonctionnalité dans ses programmes.

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