{"id":15637856,"url":"https://github.com/zkat/sheeple","last_synced_at":"2026-01-25T08:31:07.243Z","repository":{"id":54964530,"uuid":"90610","full_name":"zkat/sheeple","owner":"zkat","description":"Cheeky prototypes for Common Lisp","archived":false,"fork":false,"pushed_at":"2024-12-12T05:34:23.000Z","size":2604,"stargazers_count":104,"open_issues_count":1,"forks_count":12,"subscribers_count":11,"default_branch":"master","last_synced_at":"2025-03-29T21:11:43.144Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Common Lisp","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zkat.png","metadata":{"files":{"readme":"README.mkdn","changelog":null,"contributing":null,"funding":null,"license":"COPYING","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2008-12-15T02:09:29.000Z","updated_at":"2024-12-18T22:14:02.000Z","dependencies_parsed_at":"2025-02-04T21:45:43.796Z","dependency_job_id":"8738c078-df04-4c39-a300-098c7ee87d65","html_url":"https://github.com/zkat/sheeple","commit_stats":null,"previous_names":[],"tags_count":23,"template":false,"template_full_name":null,"purl":"pkg:github/zkat/sheeple","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zkat%2Fsheeple","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zkat%2Fsheeple/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zkat%2Fsheeple/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zkat%2Fsheeple/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zkat","download_url":"https://codeload.github.com/zkat/sheeple/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zkat%2Fsheeple/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28749285,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-25T07:58:02.558Z","status":"ssl_error","status_checked_at":"2026-01-25T07:57:57.153Z","response_time":113,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-03T11:13:32.581Z","updated_at":"2026-01-25T08:31:07.226Z","avatar_url":"https://github.com/zkat.png","language":"Common Lisp","funding_links":[],"categories":[],"sub_categories":[],"readme":"About Sheeple\n=============\n\nVision\n------\n\nSheeple is a Dynamic, CLOS-like, Delegative Prototype-based Object-Oriented Programming Framework\n(or \"POOP Framework\") that strives to optimize application flexibility, minimize cost while\nincreasing value, maximize programmer resources, and empower application implementers to better\nassist them in leveraging modern paradigms in order to proactively achieve next-generation synergy\nin tomorrow's web 3.0 world. It is implemented in (mostly) ANSI Common Lisp. Sheeple is fully\nbuzzword compliant.\n\nSheeple was originally written as a persistent library for use with [Sykosomatic][1]. Because of a\ndesire to use it in other applications, it was rewritten as a regular prototype object system and\nprovided as a standalone library meant for general-purpose OO hackery.\n\nThe goal of having a Sheeple-like persistent object store has not been abandoned. Instead, it's\nbeing implemented as a [separate library][2] using Sheeple's reflection features.\n\nSheeple is inspired by a number of Object-Oriented systems, mainly:\n\n* [CLOS][3], the Common Lisp Object System.\n\n* [Slate][4], a Smalltalk-like language with Prototype Multiple Dispatch which lies at the root of\n  Sheeple's message dispatch system.\n\n* [Self][5], another Smalltalk-like language with much literature discussing both it and the\n  concept of prototype OO. The Self compiler's maps were also an inspiration for Sheeple's molds.\n\n* [Io][6], a pure prototype language build around differential inheritance.\n\nWe are designing Sheeple with the purpose of providing the goodies of CLOS programming in a\ncompletely prototype-based environment. As such, Sheeple shares a lot of features and syntax with\nCLOS, most notably multiple inheritance and multiply-dispatched methods.\n\nSupported Platforms\n-------------------\nConfirmed to work (pass all tests):\n\n* SBCL 1.0.33\n* Clozure CL 1.4\n* GNU CLISP 2.48\n* Allegro CL 8.1\n\nSheeple doesn't use any OS-specific code (or threads), so it should be stable on all operating\nsystems. Sheeple has been tested on OSX, Linux, and Windows Vista. It should work on any\nimplementation that supports both key-weak and value-weak hashtables. If you run the test suite on a\nplatform not listed above, and all tests pass, please e-mail me and I'll add it to the list of\nsupported platforms.\n\nLoading Sheeple\n---------------\nIt's fairly effortless to get Sheeple working. To get started, simply\n\n         (require 'asdf)\n         (asdf:load-system 'sheeple)\n         (in-package sheeple-user)\n\nAnd mess around from there. Be aware that if your implementation does not include ASDF, you will\nhave to acquire it and load it yourself. CLISP, for example, will require this. For information on\nhow to do this, check out [Cliki][7], or the [ASDF Homepage][8].\n\nSheeple also includes a suite of tests you can run on whatever platform you're trying to get it to\nwork on. The test suite depends on [fiveam][9]. To run it:\n\n         (asdf:oos 'asdf:test-op 'sheeple)\n\nAnd watch the tests scroll by. All tests should pass as long as you're using a tagged release on a\nsupported platform.\n\nMailing Lists\n-------------\n\nThere are mailing lists set up in common-lisp.net. Please refer to [Sheeple's project page][10] for\nmore information.\n\nFeatures\n--------\n\n* Dynamic object management tools (inspection of objects, addition/removal of properties, all\n  without requiring full redefinition/object updating).\n\n* Differential inheritance of property values\n\n* Efficient property access.\n\n* Mostly efficient dispatch (WIP)\n\n* Integration with built-in Lisp types through autoboxing.\n\n* Multiple inheritance with dynamic inspection and management (adding/removing) of parents.\n\n* Multiple dispatch on replies (methods) -- replies specialize on specific objects, and follow their\n  inheritance hierarchies. Reply definition is almost identical to the core of CLOS methods, and\n  shares similar semantics.\n\n* CLOS-style standard combination for replies (:before, :after, and :around)\n\n\nUsing Sheeple\n=============\n\nSheeple includes a user manual with a full CLHS-style specification of the API. The manual can be\nbuilt from doc/, using make. This requires texinfo to be installed. A [prebuilt manual][11] in PDF\nformat is also available..\n\nFor a quicker introduction, you can also take a peek at the examples/ directory.\n\nAs usual, you can always contact me directly with questions. I also regularly lurk in #lisp@freenode\n(as zkat).\n\nQuick Example\n-------------\n\nThis creates a standard object with only =STANDARD-OBJECT= as its parent\n\n        SHEEPLE-USER\u003e (defparameter *my-object* (object))\n        *MY-OBJECT*\n\nWe can add properties to an object at any time. This particular call also auto-generates an accessor\nbased on the property name given.\n\n        SHEEPLE-USER\u003e (setf (property-value *my-object* 'var :accessor t) \"value\")\n        #\u003cObject #x1579A04E\u003e\n        SHEEPLE-USER\u003e (var *my-object*)\n        \"value\"\n\nCreating a new object is as simple as calling OBJECT.\n\n        SHEEPLE-USER\u003e (defparameter *child* (object :parents (list *my-object*)))\n        *CHILD*\n\nSheeple does differential inheritance by default. This means that value lookup fetches the first\navailable value found in the object's precedence list, unless a value is set directly in an object.\n\n        SHEEPLE-USER\u003e (var *child*)\n        \"value\"\n        SHEEPLE-USER\u003e (setf (var *my-object*) \"new-value\")\n        \"new-value\"\n\nWe've changed *my-object*'s VAR value, so *child*'s VAR value will also change.\n\n        SHEEPLE-USER\u003e (var *my-object*)\n        \"new-value\"\n        SHEEPLE-USER\u003e (var *child*)\n        \"new-value\"\n\nReplies are to Messages as Methods are to Generic Functions, and the semantics are very similar (at\nleast on the surface).  Note that Sheeple handles built-in Lisp objects, and can dispatch on\nthem. They are named just like the lisp types they refer to, with the =foo= naming scheme for\nprototypes.\n\n        SHEEPLE-USER\u003e (defmessage synergize (a b))\n        #\u003cMessage: SYNERGIZE #x157AAC36\u003e\n        SHEEPLE-USER\u003e (defreply synergize ((a =string=) (b =string=)) (concatenate 'string a b))\n        #\u003cReply: SYNERGIZE #x157D90FE\u003e\n        SHEEPLE-USER\u003e (defreply synergize ((a =number=) (b =number=)) (+ a b))\n        #\u003cReply: SYNERGIZE #x15815B76\u003e\n        SHEEPLE-USER\u003e (synergize \"foo \" \"bar\")\n        \"foo bar\"\n        SHEEPLE-USER\u003e (synergize 5 5)\n        10\n\nReplies are defined on sheep objects themselves. No need for eql-specialization, everything is an\n'instance' in Sheeple.\n\n        SHEEPLE-USER\u003e (defreply synergize ((a *my-object*) (b *my-object*))\n                        (object :parents (list a b)))\n        #\u003cReply: SYNERGIZE #x157C5596\u003e\n        SHEEPLE-USER\u003e (synergize *my-object* *child*)\n        ; ERROR - circular precedence graph\n        ; Evaluation aborted.\n        SHEEPLE-USER\u003e (synergize *child* *my-object*)\n        #\u003cObject #x15787456\u003e\n        SHEEPLE-USER\u003e (var (synergize *child* *my-object*))\n        \"new-value\"\n\nFinally, since objects are fully-dynamic, you can even add and remove parents by simply setting its\nobject-parents place:\n\n        SHEEPLE-USER\u003e (defparameter *my-object* (object))\n        *MY-OBJECT*\n        SHEEPLE-USER\u003e (object-parents *my-object*)\n        (#\u003cObject =STANDARD-OBJECT= #x3000413F556D\u003e)\n        SHEEPLE-USER\u003e (push (object :nickname 'some-other-object) (object-parents *my-object*))\n        (#\u003cObject SOME-OTHER-OBJECT #x30004159311D\u003e #\u003cObject =STANDARD-OBJECT= #x3000413F556D\u003e)\n        SHEEPLE-USER\u003e (object-parents *my-object*)\n        (#\u003cObject SOME-OTHER-OBJECT #x30004159311D\u003e #\u003cObject =STANDARD-OBJECT= #x3000413F556D\u003e)\n\n[1]: http://github.com/zkat/sykosomatic/\n[2]: http://github.com/zkat/shepherdb/\n[3]: http://en.wikipedia.org/wiki/CLOS\n[4]: http://slatelanguage.org/\n[5]: http://research.sun.com/self/\n[6]: http://en.wikipedia.org/wiki/Io_(programming_language)\n[7]: http://www.cliki.net/asdf\n[8]: http://common-lisp.net/project/asdf/\n[9]: http://www.cliki.net/fiveam\n[10]: http://common-lisp.net/project/sheeple\n[11]: http://sykosomatic.org/sheeple/sheeple.pdf\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzkat%2Fsheeple","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzkat%2Fsheeple","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzkat%2Fsheeple/lists"}