Code Review Stack Exchange is a question and answer site for peer programmer code reviews. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I'm writing some simple emacs tools for visual studio solutions.

I've got a function sln-process-csproj-file. This function takes the path to a project, and returns a tuple that's just a data model of the innards of the project.

Right now the return value on the last line of that function is `(,project-name ,project-path ,project-files).

I have written three getter functions to use with the list:

(defun sln-project-name (project)
  (nth 0 project))

(defun sln-project-path (project)
  (nth 1 project))

(defun sln-project-files (project)
  (nth 2 project))

Does this getter and setter boilerplate code match best practices? Is there a shorter way to write it?

share|improve this question
up vote 8 down vote accepted

Yes, it can be shortened by using defstruct. An example from the docs:

      (cl-defstruct person name age sex)
      (setq dave (make-person :name "Dave" :sex 'male))
           ⇒ [cl-struct-person "Dave" nil male]
      (setq other (copy-person dave))
           ⇒ [cl-struct-person "Dave" nil male]
      (eq dave other)
           ⇒ nil
      (eq (person-name dave) (person-name other))
           ⇒ t
      (person-p dave)
           ⇒ t
      (person-p [1 2 3 4])
           ⇒ nil
      (person-p "Bogus")
           ⇒ nil
      (person-p '[cl-struct-person counterfeit person object])
           ⇒ t

Alternatively, if you want something more heavy weight, there is a CLOS-like object system.

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.