all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* eieio defclass evaluate :initform value
@ 2017-01-04 20:04 Joe Riel
  2017-01-04 20:45 ` Eric Abrahamsen
  2017-01-04 22:43 ` Stefan Monnier
  0 siblings, 2 replies; 5+ messages in thread
From: Joe Riel @ 2017-01-04 20:04 UTC (permalink / raw)
  To: Help GNU Emacs

According to the info page for eieio for Emacs 23, one
could do

(defclass foo-class
   ((bar :initform (lambda () my-var)
         :type string)))

When make-instance was called, the lambda expression
for :initform would be evaluated and the expression
assigned to my-var would be used for the slot bar.

The info page for eieio Emacs 24 does not mention this 
functionality and testing shows it no longer exists.

Is there nice way, in 24, to create a class with an :initform
that, upon instantiation, evaluates to the value of a variable?
  

-- 
Joe Riel




^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: eieio defclass evaluate :initform value
  2017-01-04 20:04 eieio defclass evaluate :initform value Joe Riel
@ 2017-01-04 20:45 ` Eric Abrahamsen
  2017-01-05 16:06   ` Joe Riel
  2017-01-04 22:43 ` Stefan Monnier
  1 sibling, 1 reply; 5+ messages in thread
From: Eric Abrahamsen @ 2017-01-04 20:45 UTC (permalink / raw)
  To: help-gnu-emacs

Joe Riel <joer@san.rr.com> writes:

> According to the info page for eieio for Emacs 23, one
> could do
>
> (defclass foo-class
>    ((bar :initform (lambda () my-var)
>          :type string)))
>
> When make-instance was called, the lambda expression
> for :initform would be evaluated and the expression
> assigned to my-var would be used for the slot bar.
>
> The info page for eieio Emacs 24 does not mention this 
> functionality and testing shows it no longer exists.
>
> Is there nice way, in 24, to create a class with an :initform
> that, upon instantiation, evaluates to the value of a variable?

Depending on what exactly you want, you might be able to solve it with
`oset-default', which lives outside the class definition, and can
evaluate variables. See if that does what you want?

Eric




^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: eieio defclass evaluate :initform value
  2017-01-04 20:04 eieio defclass evaluate :initform value Joe Riel
  2017-01-04 20:45 ` Eric Abrahamsen
@ 2017-01-04 22:43 ` Stefan Monnier
  1 sibling, 0 replies; 5+ messages in thread
From: Stefan Monnier @ 2017-01-04 22:43 UTC (permalink / raw)
  To: help-gnu-emacs

> (defclass foo-class
>    ((bar :initform (lambda () my-var)
>          :type string)))

As the name implies, :initform expects a *form* rather than a function.
The above will simply initialize `bar` by default to have as value
a function of no arguments that returns the value of `my-var`.

> When make-instance was called, the lambda expression
> for :initform would be evaluated and the expression
> assigned to my-var would be used for the slot bar.

You can do

    (defclass foo-class ()
       ((bar :initform (progn my-var)
             :type string)))

[ For backward compatibility reasons, just using `my-var` doesn't work,
  because the EIEIO code treated symbols as unevaluated.  ]

> Is there nice way, in 24, to create a class with an :initform
> that, upon instantiation, evaluates to the value of a variable?
  
Does the above work for you?


        Stefan




^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: eieio defclass evaluate :initform value
  2017-01-04 20:45 ` Eric Abrahamsen
@ 2017-01-05 16:06   ` Joe Riel
  2017-01-05 18:56     ` Eric Abrahamsen
  0 siblings, 1 reply; 5+ messages in thread
From: Joe Riel @ 2017-01-05 16:06 UTC (permalink / raw)
  To: Eric Abrahamsen; +Cc: help-gnu-emacs

On Wed, 04 Jan 2017 12:45:22 -0800
Eric Abrahamsen <eric@ericabrahamsen.net> wrote:

> Joe Riel <joer@san.rr.com> writes:
> 
> > According to the info page for eieio for Emacs 23, one
> > could do
> >
> > (defclass foo-class
> >    ((bar :initform (lambda () my-var)
> >          :type string)))
> >
> > When make-instance was called, the lambda expression
> > for :initform would be evaluated and the expression
> > assigned to my-var would be used for the slot bar.
> >
> > The info page for eieio Emacs 24 does not mention this 
> > functionality and testing shows it no longer exists.
> >
> > Is there nice way, in 24, to create a class with an :initform
> > that, upon instantiation, evaluates to the value of a variable?
> 
> Depending on what exactly you want, you might be able to solve it with
> `oset-default', which lives outside the class definition, and can
> evaluate variables. See if that does what you want?

Thanks, Eric; I wasn't aware of oset-default and could use it, however,
am currently taking a different approach.  The bigger picture is that
I'm using a buffer-local object to store configuration data for a
major mode.  The object is normally updated when the mode is invoked,
but the global defaults should be configurable.  The current approach
is to clone a default object whose values can be assigned via a 
customization.  The documentation for using defcustom with an eieio object
is slim, but I got it working.


-- 
Joe Riel




^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: eieio defclass evaluate :initform value
  2017-01-05 16:06   ` Joe Riel
@ 2017-01-05 18:56     ` Eric Abrahamsen
  0 siblings, 0 replies; 5+ messages in thread
From: Eric Abrahamsen @ 2017-01-05 18:56 UTC (permalink / raw)
  To: help-gnu-emacs

Joe Riel <joer@san.rr.com> writes:

> On Wed, 04 Jan 2017 12:45:22 -0800
> Eric Abrahamsen <eric@ericabrahamsen.net> wrote:
>
>> Joe Riel <joer@san.rr.com> writes:
>> 
>> > According to the info page for eieio for Emacs 23, one
>> > could do
>> >
>> > (defclass foo-class
>> >    ((bar :initform (lambda () my-var)
>> >          :type string)))
>> >
>> > When make-instance was called, the lambda expression
>> > for :initform would be evaluated and the expression
>> > assigned to my-var would be used for the slot bar.
>> >
>> > The info page for eieio Emacs 24 does not mention this 
>> > functionality and testing shows it no longer exists.
>> >
>> > Is there nice way, in 24, to create a class with an :initform
>> > that, upon instantiation, evaluates to the value of a variable?
>> 
>> Depending on what exactly you want, you might be able to solve it with
>> `oset-default', which lives outside the class definition, and can
>> evaluate variables. See if that does what you want?
>
> Thanks, Eric; I wasn't aware of oset-default and could use it, however,
> am currently taking a different approach.  The bigger picture is that
> I'm using a buffer-local object to store configuration data for a
> major mode.  The object is normally updated when the mode is invoked,
> but the global defaults should be configurable.  The current approach
> is to clone a default object whose values can be assigned via a 
> customization.  The documentation for using defcustom with an eieio object
> is slim, but I got it working.

Yup, that would be awkward to do with `oset-default'. Glad you got
something working.

Eric




^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2017-01-05 18:56 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-01-04 20:04 eieio defclass evaluate :initform value Joe Riel
2017-01-04 20:45 ` Eric Abrahamsen
2017-01-05 16:06   ` Joe Riel
2017-01-05 18:56     ` Eric Abrahamsen
2017-01-04 22:43 ` Stefan Monnier

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.