Skip to content

Instantly share code, notes, and snippets.

@death
Created December 2, 2017 21:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save death/c63fa9dca9bca8d70d00ce78b4e5cadb to your computer and use it in GitHub Desktop.
Save death/c63fa9dca9bca8d70d00ce78b4e5cadb to your computer and use it in GitHub Desktop.
(defpackage #:snippets/slot-values
(:use #:cl))
(in-package #:snippets/slot-values)
(defun slot-values* (object &rest slot-names)
(mapcar (lambda (slot-name) (slot-value object slot-name))
slot-names))
(defun (setf slot-values*) (new-values object &rest slot-names)
(mapc (lambda (new-value slot-name)
(setf (slot-value object slot-name) new-value))
new-values
slot-names))
(eval-when (:compile-toplevel :load-toplevel :execute)
(defun quotify (object)
(list 'quote object)))
(defmacro slot-values (object &rest slot-names)
`(slot-values* ,object ,@(mapcar (lambda (slot-name) (quotify slot-name)) slot-names)))
(defclass employee ()
((name :initarg :name :accessor name)
(age :initarg :age :accessor age)
(company :initarg :company :accessor company)
(title :initarg :title :accessor title)))
(defun new-employee ()
(make-instance 'employee
:name "Steve"
:age 39
:company "Google"
:title "Janitor"))
(defun test-slot-values ()
(let ((e (new-employee)))
(setf (slot-values e name age company title)
'("ApproxSteve" (around 39) "Goog1e" "Putzfrau"))
(slot-values e name age company title)))
(defun test-slot-values* ()
(let ((e (new-employee)))
(setf (slot-values* e 'name 'age 'company 'title)
'("NotSteve" (not 39) "NotGoogle" "NonJanitor"))
(slot-values* e 'name 'age 'company 'title)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment