all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: thierry.volpiatto@gmail.com
To: "Drew Adams" <drew.adams@oracle.com>
Cc: help-gnu-emacs@gnu.org
Subject: Re: Something like an array (list) of a class
Date: Sun, 12 Apr 2009 19:15:49 +0200	[thread overview]
Message-ID: <878wm5sshm.fsf@tux.homenetwork> (raw)
In-Reply-To: <001401c9bb89$e18f0510$0200a8c0@us.oracle.com> (Drew Adams's message of "Sun, 12 Apr 2009 09:15:21 -0700")

Hi Drew,
"Drew Adams" <drew.adams@oracle.com> writes:

>> >> > 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.
>
Very interesting, did you already use this kind of mechanism in some of
your programs ?

-- 
A + Thierry Volpiatto
Location: Saint-Cyr-Sur-Mer - France




  reply	other threads:[~2009-04-12 17: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
2009-04-12 17:15         ` thierry.volpiatto [this message]
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

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=878wm5sshm.fsf@tux.homenetwork \
    --to=thierry.volpiatto@gmail.com \
    --cc=drew.adams@oracle.com \
    --cc=help-gnu-emacs@gnu.org \
    /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.
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.