52 votes

Quelle est la différence entre defvar, defparameter, setf et setq

J'ai trouvé une question similaire .

Mais je ne comprends pas bien cette explication.

J'essaie donc d'exécuter clisp avec l'exemple suivant :

   [1]> (defvar a 5)
  A
  [2]> (+ a 1)
  6
  [3]> (defparameter b 5)
  B
  [4]> (+ b 1)
  6
  [5]> (setf c 5)
  5
  [6]> (+ c 1)
  6
  [7]> (setq d 5)
  5
  [8]> (+ d 1)
  6
  [9]> (let ((a 500)) (+ a 1))
  501
  [10]> (let ((b 500)) (+ b 1))
  501
  [11]> (let ((c 500)) (+ c 1))
  501
  [12]> (let ((d 500)) (+ d 1))
  501
  [13]> 

Ce que j'ai trouvé est totalement le même.

Je ne peux pas comprendre ce qui est différent avec eux?

79voto

Michał Kwiatkowski Points 2777

DEFPARAMETER attribue toujours une valeur. Donc:

 [1]> (defparameter a 1)
A
[2]> (defparameter a 2)
A
[3]> a
2

tandis que DEFVAR ne le fait qu'une seule fois, donc :

 [4]> (defvar b 1)
B
[5]> (defvar b 2)
B
[6]> b
1

SETF est une macro qui utilise SETQ interne, mais a plus de possibilités. D'une certaine manière, c'est un opérateur d'affectation plus général. Par exemple avec SETF vous pouvez faire :

 [19]> (defparameter c (list 1 2 3))
[21]> (setf (car c) 42)                                              
42
[22]> c
(42 2 3)

mais vous ne pouvez pas le faire avec SETQ :

 [23]> (setq (car c) 42)                                              
*** - SETQ: (CAR C) is not a symbol
The following restarts are available:
USE-VALUE      :R1      Input a value to be used instead.
ABORT          :R2      Abort main loop
Break 1 [24]> abort

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