Skip to content

Instantly share code, notes, and snippets.

@obriencj
Last active July 29, 2017 17:09
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 obriencj/ede1ee193ba616c3b24bdf0639fbc98a to your computer and use it in GitHub Desktop.
Save obriencj/ede1ee193ba616c3b24bdf0639fbc98a to your computer and use it in GitHub Desktop.
sibilant defclass sample
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!
(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