From: "Drew Adams" <drew.adams@oracle.com>
To: <thierry.volpiatto@gmail.com>, <help-gnu-emacs@gnu.org>
Subject: RE: Something like an array (list) of a class
Date: Sun, 12 Apr 2009 09:15:21 -0700 [thread overview]
Message-ID: <001401c9bb89$e18f0510$0200a8c0@us.oracle.com> (raw)
In-Reply-To: <87tz4ub8ow.fsf@tux.homenetwork>
> >> > I would like to make some datadriven functionality. Is
> >> > there a way to make sure a list is filled with a certain
> >> > type of data. I would like to make sure that every element
> >> > of my list contains: a type, a description, a functionname
> >> > and room to store a string. Is this possible?
> >>
> >> ,----
> >> | ELISP> (setq B '(2 "some text" message nil))
> >> | (2 "some text" message nil)
> >> |
> >> | ELISP> (if (and (find-if 'numberp B)
> >> | (find-if 'stringp B)
> >> | (find-if 'functionp B)
> >> | (null (car (last B))))
> >> | t
> >> | nil)
> >> | t
> >> `----
> >
> > Partly. This is an 'object' and not a list of objects. But I
> > understand correctly that it is not possible to define real objects?
> > What I would like is something like (C++ code):
> >
> > class Object {
> > String type;
> > String description;
> > String functionname;
> > String displayString;
> > }
> >
> > std::vector <Object> objectVector;
> >
> > When given a certain type I then need to retreive the 'object' from
> > the list to use.
>
> There is no class in elisp but you have defstruct (be sure to
> require 'cl)
>
> ,----
> | ELISP> (defstruct Object type description functionname
> | displaystring)
> | Object
> | ELISP> (defvar test-obj (make-Object :type 1 :description
> | "test" :functionname 'message :displaystring nil))
> | test-obj
> | ELISP> (Object-type test-obj)
> | 1
> | ELISP> (Object-functionname test-obj)
> | message
> | ELISP> (Object-description test-obj)
> | "test"
> `----
Various books and Web sites about Lisp show you how to implement objects in
Lisp, depending on what you mean by "object" (abstract data type? mutable
object? classes? inheritance?...).
In addition to Common Lisp's `defstruct', there is the Common Lisp Object System
(CLOS), but Emacs Lisp support for it is wanting. (From the Elisp manual: "Some
features are too complex or bulky relative to their benefit to Emacs Lisp
programmers. CLOS and Common Lisp streams are fine examples of this group.")
One thing you might also consider (again, depending on what you need/want), is
that Emacs Lisp does provide a type-checking mechanism - in the context of
Customize. This is often overlooked or under-exploited. Customize options can be
complex structures whose parts are well typed, and compile-time and runtime
type-checking are available. In addition, you can define initialization and
set/put methods/triggers.
Whether you want to use options for your data structures in general is another
question. You would be exploiting the type-definition and type-checking features
of Customize without necessarily wanting to create user-visible options. But
this type manipulation is an existing and powerful Emacs-Lisp feature that you
can use in ways other than those originally intended.
next prev parent reply other threads:[~2009-04-12 16:15 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-04-10 20:32 Something like an array (list) of a class Decebal
2009-04-11 8:08 ` thierry.volpiatto
[not found] ` <mailman.5118.1239437738.31690.help-gnu-emacs@gnu.org>
2009-04-12 7:25 ` Decebal
2009-04-12 8:03 ` thierry.volpiatto
2009-04-12 16:15 ` Drew Adams [this message]
2009-04-12 17:15 ` thierry.volpiatto
2009-04-12 17:45 ` Drew Adams
[not found] ` <mailman.5186.1239523825.31690.help-gnu-emacs@gnu.org>
2009-04-13 8:53 ` Decebal
2009-04-13 11:55 ` Decebal
2009-04-13 12:27 ` Decebal
2009-04-13 14:56 ` Decebal
2009-04-13 17:57 ` Decebal
2009-04-14 0:52 ` Barry Margolin
2009-04-14 4:44 ` Decebal
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='001401c9bb89$e18f0510$0200a8c0@us.oracle.com' \
--to=drew.adams@oracle.com \
--cc=help-gnu-emacs@gnu.org \
--cc=thierry.volpiatto@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).