unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
From: Matt <matt@excalamus.com>
To: "help-gnu-emacs" <help-gnu-emacs@gnu.org>
Subject: Navigating Lisp data structures
Date: Sun, 04 Dec 2022 14:00:25 -0500	[thread overview]
Message-ID: <184de82cf09.eebfb5c8843687.6482234845227025147@excalamus.com> (raw)

I'm writing an Emacs package and struggling to figure out how to represent the data in a Lisp data structure.  I'm getting lost in whether it should be an alist of alists, a plist of plists, an alist of plists, etc.  Or maybe it would be better to use a cl-struct or a hash or a class or a vector or a record.  Should I use keywords or not, etc.  

Here is a detailed explanation of my issue:

My Emacs package manages my project workflows (e.g. Python or C).  Each project has a name, associated files, one or more shell processes (comints), as well as commands for a specific shell and commands used across the shells.  It also sets my window layout.

In Python, I might structure the data something like this:

projects = {
    "my_c_project": {
        'shells': {
            "*build*": {"root": "/path/to/build/directory/", "setup": ("export MYBUILDVAR1=1", "export MYBUILDVAR2=0")},
            "*run*": {"root": "/path/to/run/directory/", "setup": ("export MYRUNVAR=1")}
        },
        'commands': ("./build_my_project.sh", "./run_my_build"),
        'files': ("/path/to/entrypoint.c", "/path/to/other/file/I/care/about.c"),
        'window_split': ("quad", ),  # C-x 3 C-x 2 other-window other-window C-x 2
    },
    "my_python_project": {
        'shells': {"*my_python_project*":  {"root": "/path/to/my/python/project", "setup": ("source venv/bin/activate")}},
        'commands': ("python3 -m my_python_project",
                     "python3 -m unittest discover tests/ --failfast --quiet", ),
        'files': ("/path/to/my_python_project/entry_point.py", ),
        'window_split': ("half", ), # C-x 3
    }
}

I could then get the information I need through chaining look ups.  If we pretended that Emacs used Python, activating a project might look something like this:

(Pdb) # create shells
(Pdb) for name in projects['my_python_project']['shells']: pass  # call comint creation command
(Pdb) # setup shell environments
(Pdb) for command in projects['my_python_project']['shells']['*my_python_project*']['setup']: pass  # pass each command in the comint
(Pdb) # load files
(Pdb) for file in projects['my_python_project']['files']: pass  #  run emacs find-file
(Pdb) # and so on

Of course the data could be represented using classes instead of dicts.  However, I hope the problem is clear.

I'm obviously looking at the problem through the lens of Python key-value structures.  When I try to translate the data structure to something like nested plists, it feels messy.  Maybe that's me simply being uncomfortable with nested lists?  When I mix list types (e.g. an alist of plists), the lookup syntax becomes inconsistent (a mix of assocs and plist-gets, scattered with cars and cdrs and weird cases in which I have a list of strings I can't seem to access).  

Guidance would be sincerely appreciated.




             reply	other threads:[~2022-12-04 19:00 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-12-04 19:00 Matt [this message]
2022-12-05  0:46 ` Navigating Lisp data structures Joost Kremers
2022-12-06 15:36   ` Matt
2022-12-05  2:05 ` Eric Abrahamsen
2022-12-07  4:06   ` Matt
2022-12-07 18:01     ` Eric Abrahamsen

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=184de82cf09.eebfb5c8843687.6482234845227025147@excalamus.com \
    --to=matt@excalamus.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.
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).