emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Emacs-diffs] trunk r116995: cl-lib defstruct introspection


From: Stefan Monnier
Subject: Re: [Emacs-diffs] trunk r116995: cl-lib defstruct introspection
Date: Mon, 21 Apr 2014 11:38:16 -0400
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.4.50 (gnu/linux)

[ I wrote this yesterday already, but somehow it got eaten by Murphy or
  something.  ]

>   cl-lib defstruct introspection

Please always use the ChangeLog entry as commit message.

> +The @code{cl-defstruct} package also provides a few structure
> +introspection functions.

I'm curious: when/where did you bump against a need for that?

> address@hidden cl-struct-set-slot-value struct-type slot-name inst value

We don't need this, since we can always use setf instead.

> -(defun cl--const-expr-val (x)
> +(defun cl--const-expr-val (x &optional environment default)

`environment' is always macroexpand-all-environment, and `default' is
never used, so you can revert this part of the change.

> -                                      `'(nil ,(cl--const-expr-val def))
> +                                      `'(nil ,(cl--const-expr-val
> +                                                  def 
> macroexpand-all-environment))

Don't go past the 80th column, please.  Undoing the cl--const-expr-val
signature change will fix this problem in most of your patch.

> +(defmacro cl-the (type form)
> +  "Return FORM.  If type-checking is enabled, assert that it is of TYPE."
>    (declare (indent 1) (debug (cl-type-spec form)))
> -  form)
> +  (if (not (or (not (cl--compiling-file))

Unless absolutely needed, we should drop this (cl--compiling-file) test,
because cl--compiling-file is an ugly hack.

> +(defun cl-struct-sequence-type (struct-type)
> +  "Return the sequence used to build STRUCT-TYPE.
> +STRUCT-TYPE is a symbol naming a struct type.  Return 'vector or
> +'list, or nil if STRUCT-TYPE is not a struct type. "
> +  (car (get struct-type 'cl-struct-type)))
> +(put 'cl-struct-sequence-type 'side-effect-free t)

Please add `side-effect-free' to defun-declarations-alist, so we can
move these into `declare's, which is cleaner (it associates them with
the function itself rather than with the shared symbol).

> +(defsetf cl-struct-slot-value cl-struct-set-slot-value)

Please use (declare (gv-setter ...)) or (declare (gv-expand ...)).
Also, we should define it better such that (incf (cl-struct-slot-value ..))
only computes the offset and tests the type once.

> +(cl-define-compiler-macro cl-struct-slot-value

Please use (declare (compiler-macro ..)).

> +    (&whole orig struct-type slot-name inst)
> +  (or (let* ((macenv macroexpand-all-environment)
> +             (struct-type (cl--const-expr-val struct-type macenv))
> +             (slot-name (cl--const-expr-val slot-name macenv)))
> +        (and struct-type (symbolp struct-type)
> +             slot-name (symbolp slot-name)
> +             (assq slot-name (cl-struct-slot-info struct-type))
> +             (let ((idx (cl-struct-slot-offset struct-type slot-name)))
> +               (cl-ecase (cl-struct-sequence-type struct-type)
> +                 (vector `(aref (cl-the ,struct-type ,inst) ,idx))
> +                 (list `(nth ,idx (cl-the ,struct-type ,inst)))))))
> +      orig))

How important is this optimization?  I mean, if struct-type and
slot-name are constants, then presumably, the code could have used the
accessor function instead, no?
I guess this goes back to the earlier question about when/where the use
for this functionality came up.


        Stefan



reply via email to

[Prev in Thread] Current Thread [Next in Thread]