* 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
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).