Skip to content

brandonwillard/adderall

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Adderall

Build Status Downloads Version

This library contains an implementation of miniKanren in Hy. It is a naive implementation, speed isn't the primary concern.

Example

(import  [adderall.dsl [*]])
(require [adderall.dsl [*]])

(run* [q] (condᵉ [( q 'tea)]
                 [( q 'coffee) succeed]))
;; => ['tea 'coffee]

(run* [q] (condᵉ [( q 'tea)]
                 [( q 'coffee) fail]))
;; => ['tea]

(import [getpass [getuser]])

(deftag h [_] "#hy")
(defn lovesᵒ [u v] ( v #h y))
(run* [who what] (lovesᵒ who what)
                 ( who (getuser))
                 ( what #h y))
;; => [['algernon' '#hy']]

More examples can be found in the test suite, and in particular, the tests adapted from The Reasoned Schemer.

Adderall also comes with a set of extra functions, which are there mostly to show the power of the system, or for fun:

(import [adderall.dsl [*]]
        [adderall.extra.zebra [*]])
(require [adderall.dsl [*]])
(require [adderall.extra.zebra [*]])

(run* [water-drinker horse-owner] (zebraᵖ water-drinker horse-owner))
;; => [['norvegian 'japanese]]

For a practical use, see Hydiomatic, a static analyser and code transformer built upon Adderall, or wynck, a tool to reason about your window layout.

License

All the code is licensed under the GNU Lesser General Public License (v3+).