33 votes

Quelle est la difference entre 1 et '1 in Lisp?

Je n'avais jamais vraiment pensé si un symbole pouvait être un nombre en Lisp, alors je l'ai joué avec:

 > '1
1
> (+ '1 '1)
2
> (+ '1 1)
2
> (define a '1)
> (+ a 1)
2
 

Le code ci-dessus est un schéma, mais il semble être à peu près le même dans Common Lisp et Clojure. Y a-t- il une différence entre 1 et 1 cité?

26voto

Xach Points 6564

Dans Common Lisp, '1 est un raccourci pour (QUOTE 1). Lorsque évalué, (QUOTE quelque chose ) retourne la partie quelque chose , non évaluée. Cependant, il n'y a pas de différence entre 1 évalué et 1 non évalué.

Il y a donc une différence pour le lecteur: '1 se lit comme (QUOTE 1) et 1 se lit comme 1. Mais il n'y a pas de différence quand on les évalue.

14voto

Ken Points 583

Les nombres sont des objets auto-évaluables . C'est pourquoi vous n'avez pas à vous soucier de les citer, comme vous le faites avec, par exemple, des listes.

Un symbole peut être fabriqué à partir de n'importe quelle chaîne. Si vous voulez le symbole dont le nom est le caractère unique 1 , vous pouvez dire:

 (intern "1")
 

qui imprime |1| , suggérant un autre moyen de le saisir:

 '|1|
 

11voto

mcandre Points 6965

Citant empêche l'évaluation des expressions jusqu'à ce que plus tard. Par exemple, la suite n'est pas une bonne liste:

(1 2 3)

C'est parce que Lisp interprète 1 comme une fonction, ce qui ne l'est pas. Si la liste doit être cité:

'(1 2 3)

Lorsque vous citez une expression simple comme un nombre, Lisp effectivement ne modifie pas son comportement.

Voir Wikipédia: Lisp.

9voto

Zorf Points 2931

Eh bien, ils sont en fait très différents. '1 est toutefois exactement le même que (quote 1). (car ''x) évalue le symbole 'citation'.

1 est une S-expression, c'est la représentation d'une donnée, d'un numéro 1. Dire qu' 1 est un "numéro d'objet" ou une S-expression pour entrer dans un objet à la fois acceptable. Souvent, il est dit qu' 1 est la représentation externe pour le nombre réel de l'objet.

(quote 1) est une autre S-expression, c'est une S-expression d'une liste dont le premier élément est le symbole 'citation' et dont le second élément est le nombre 1. C'est là que c'est déjà différent, les mots syntaxiques, contrairement aux fonctions, ne sont pas considérés comme des objets dans la langue, et ils n'évaluent pas à eux.

Toutefois, les deux sont des représentations externes des objets (données) qui évaluent le même système de référence. Le nombre dont la représentation externe est - 1, cependant, ce ne sont certainement pas les mêmes objets, les mêmes, le code, le même système de référence géodésique le même que ce soit, ils ont juste évaluer de la même chose. Les numéros d'évaluer eux-mêmes. Dire qu'ils sont de la même est-à-dire que:

(+ 1 (* 3 3))

Et

(if "Strings are true" (* 5 (- 5 3)) "Strings are not true? This must be a bug!")

Sont "les mêmes", ils ne le sont pas, ils sont tous les deux différents programmes qui venez d'arriver à mettre fin à la même valeur, un lisp forme est aussi un programme, un formulaire est une donnée qui est aussi un programme, n'oubliez pas.

Aussi, j'ai appris un truc utile une fois que cela montre que l'auto-évaluation des données sont vraiment pas des symboles lors de la saisie:

(let ((num 4))
  (symbol? num) ; ====> evaluates to #f
  (symbol? 'num) ; ====> evaluates to #t
  (symbol? '4) ; ====> evaluates to #f
  (symbol? '#\c) ; #f again, et cetera
  (symbol? (car ''x)) ; #t
  (symbol? quote) ; error, in most implementations
)

Auto-évaluation des données véritablement évaluer à eux-mêmes, ils ne sont pas prédéfinis par les symboles' de quelques sortes.

1voto

Secko Points 2054

En Lisp, l'apostrophe empêche l'évaluation des symboles. L'utilisation d'une apostrophe avant un chiffre n'est pas interdite, cela n'est pas nécessaire car les nombres se représentent eux-mêmes. Cependant, comme toute autre liste, il est automatiquement transformé en appel de fonction approprié. L'interprète considère que ces chiffres coïncident avec leur valeur.

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