Last active
July 29, 2017 17:09
-
-
Save obriencj/ede1ee193ba616c3b24bdf0639fbc98a to your computer and use it in GitHub Desktop.
sibilant defclass sample
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
maybe:python-sibilant siege$ sibilant sample_defclass.lspy | |
Tom says: Hey there, Sally | |
Sally says: What's up, Tom | |
Tom says: Good-bye! | |
Sally says: Good-bye! |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(defmacro method (name params . &body) | |
`(let ((*method* (lambda ,params ,@&body)) | |
(*name* ,(str name))) | |
(setf *method* __name__ *name*) | |
(set-item *members* *name* *method*))) | |
(defmacro class (name bases . &body) | |
`(let ((*members* (dict)) | |
(*name* ,(str name))) | |
,@&body | |
(type *name* | |
(make-tuple ,@bases) | |
*members*))) | |
(defmacro defclass (name bases . &body) | |
`(define ,name (class ,name ,bases ,@&body))) | |
(defclass Person (object) | |
(method __init__ (self name) | |
(set! self.name name)) | |
(method say (self . &messages) | |
(apply print (cons self.name "says:" &messages))) | |
(method goodbye (self) | |
(self.say "Good-bye!")) | |
(method greet (self buddy) | |
(self.say "Hey there," buddy.name) | |
(buddy.respond self)) | |
(method respond (self buddy) | |
(self.say "What's up," buddy.name))) | |
(defmacro defperson (name) | |
`(define ,name (Person ,(str name)))) | |
(defperson Tom) | |
(defperson Sally) | |
(Tom.greet Sally) | |
(Tom.goodbye) | |
(Sally.goodbye) | |
;; The end. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment