Getter/Setters
How many times have you created two function for setting a specific value and then getting the value?
(let ((value "")) (defun property (&key is) (cond (is (setf value is)) (t value))) ;;; here is getter and setter functions (defun get-property () value) (defun set-property (data) (setf value data))) (define-test get_set-property (assert-equal "" (get-property)) (assert-equal "property" (set-property "property")) (assert-equal "property" (get-property)) (assert-equal "" (set-property ""))) (define-test property (assert-equal "" (property)) (assert-equal "property" (property :is "property")) (assert-equal "property" (property)) (assert-equal "" (property :is ""))
Using a &key keyword parameter adds syntatic sugar to setting properties. It also means less typing.
It is done with a conditional. Another benefit is that behavior for the property is located in only one function instead of two functions.
New Use Case
(Zach Beane’s Request)
Need to be able to set the property to nil. Added the test to my unit tests. It failed. Modified the code and now it passes.
You just need to add a supplied-p parameter.
(let ((value "")) (defun property (&key (is nil is-p)) (cond (is-p (setf value is)) (t value)))) (define-test property (assert-equal "" (property)) (assert-equal "property" (property :is "property")) (assert-equal "property" (property)) (assert-equal "" (property :is "")) (assert-equal nil (property :is nil)))
Happy Lisp Cargo-Culting!
December 8, 2008 at 01:30 |
Never. Who writes Lisp like that? Use CLOS.
December 8, 2008 at 08:16 |
Well…
I do.
December 8, 2008 at 05:39 |
And what if you want to set something to NIL?
December 8, 2008 at 08:18 |
@Zach
I didn’t take that use case into account. Your wish is DONE!
December 8, 2008 at 12:32 |
It’s not a very good idea.
December 8, 2008 at 14:27 |
How is it not a very good idea? What would be a better idea? I’m really interested in your thoughts on this.
December 9, 2008 at 07:03 |
In Common Lisp, the setter for (FOO) looks like (SETF (FOO) …), not (FOO :IS …).