Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Ajout de capacités d'affectation à setf

4 views
Skip to first unread message

Yliur

unread,
Oct 22, 2011, 7:54:11 PM10/22/11
to

Bonjour

Pour étendre les capacités de setf, j'ai trouvé plusieurs méthodes :
- Les macros define-setf-expander et defsetf d'un côté, la deuxième
étant un moyen de traiter simplement les cas simples et la première
étant plus générique si j'ai bien compris ce que raconte
l'Hyperspec.
- Une méthode présentée dans Practical Common Lisp, avec cet exemple :
(defun (setf customer-name) (name account)
(setf (slot-value account 'customer-name) name))

Y a-t-il une différence entre ces deux méthodes ?

Merci

Yliur

Pascal J. Bourguignon

unread,
Oct 22, 2011, 8:39:27 PM10/22/11
to
Oui.

Pour implementer une place ayant plusieurs valeurs, similaire à :

(setf (values q r) (truncate n d))

ou pour implémenter une place "inverse" comme:

(setf (/ x 2) 4)
(assert (= x 8))

define-setf-expander est nécessaire.


--
__Pascal Bourguignon__ http://www.informatimago.com/
A bad day in () is better than a good day in {}.

Yliur

unread,
Oct 23, 2011, 8:36:02 PM10/23/11
to
Le Sun, 23 Oct 2011 02:39:27 +0200
"Pascal J. Bourguignon" <p...@informatimago.com> a écrit :

> Yliur <yl...@free.fr> writes:
>
> > Pour étendre les capacités de setf, j'ai trouvé plusieurs méthodes :
> > - Les macros define-setf-expander et defsetf d'un côté, la
> > deuxième étant un moyen de traiter simplement les cas simples et la
> > première étant plus générique si j'ai bien compris ce que raconte
> > l'Hyperspec.
> > - Une méthode présentée dans Practical Common Lisp, avec cet
> > exemple : (defun (setf customer-name) (name account)
> > (setf (slot-value account 'customer-name) name))
>
>
>
> > Y a-t-il une différence entre ces deux méthodes ?
>
> Oui.
>
> Pour implementer une place ayant plusieurs valeurs, similaire à :
>
> (setf (values q r) (truncate n d))
>
> ou pour implémenter une place "inverse" comme:
>
> (setf (/ x 2) 4)
> (assert (= x 8))
>
> define-setf-expander est nécessaire.

Merci

0 new messages